Команда Linux / Unix, чтобы определить, запущен ли процесс? - PullRequest
90 голосов
/ 02 февраля 2012

Мне нужна не зависящая от платформы (Linux / Unix | OSX) команда shell / bash, которая определит, запущен ли конкретный процесс.например, mysqld, httpd ... Какой самый простой способ / команда для этого?

Ответы [ 14 ]

0 голосов
/ 01 февраля 2018

Вот моя версия.Особенности:

  • проверяет точное имя программы (первый аргумент функции).поиск «mysql» не будет соответствовать выполнению «mysqld»
  • поиск аргументов программы (второй аргумент функции)

script:

#!/bin/bash

# $1 - cmd
# $2 - args
# return: 0 - no error, running; 1 - error, not running
function isRunning() {
    for i in $(pidof $1); do
        cat /proc/$i/cmdline | tr '\000' ' ' | grep -F -e "$2" 1>&2> /dev/null
        if [ $? -eq 0 ]; then
            return 0
        fi
    done
    return 1
}

isRunning java "-Djava.util.logging.config.file=logging.properties"
if [ $? -ne 0 ]; then
    echo "not running, starting..."
fi
0 голосов
/ 19 июня 2015

Это печатает число процессов, базовое имя которых является "chromium-browser":

ps -e -o args= | awk 'BEGIN{c=0}{
 if(!match($1,/^\[.*\]$/)){sub(".*/","",$1)} # Do not strip process names enclosed by square brackets.
 if($1==cmd){c++}
}END{print c}' cmd="chromium-browser"

Если это печатает "0", процесс не запущен.Команда предполагает, что путь процесса не содержит пробелов.Я не проверял это с приостановленными процессами или процессами зомби.

Протестировано с использованием gwak в качестве альтернативы awk в Linux.

Вот более универсальное решение с некоторыми примерами использования:

#!/bin/sh
isProcessRunning() {
if [ "${1-}" = "-q" ]; then
 local quiet=1;
 shift
else
 local quiet=0;
fi
ps -e -o pid,args= | awk 'BEGIN{status=1}{
 name=$2
 if(name !~ /^\[.*\]$/){sub(".*/","",name)} # strip dirname, if process name is not enclosed by square brackets.
 if(name==cmd){status=0; if(q){exit}else{print $0}}
}END{exit status}' cmd="$1" q=$quiet
}

process='chromium-browser'

printf "Process \"${process}\" is "
if isProcessRunning -q "$process" 
 then printf "running.\n"
 else printf "not running.\n"; fi

printf "Listing of matching processes (PID and process name with command line arguments):\n"
isProcessRunning "$process"
0 голосов
/ 14 ноября 2013

Следующая функция оболочки, основанная только на стандартных командах и параметрах POSIX, должна работать в большинстве (если не в любых) системах Unix и Linux. :

isPidRunning() {
  cmd=`
    PATH=\`getconf PATH\` export PATH
    ps -e -o pid= -o comm= |
      awk '$2 ~ "^.*/'"$1"'$" || $2 ~ "^'"$1"'$" {print $1,$2}'
  `
  [ -n "$cmd" ] &&
    printf "%s is running\n%s\n\n" "$1" "$cmd" ||
    printf "%s is not running\n\n" $1
  [ -n "$cmd" ]
}

$ isPidRunning httpd
httpd is running
586 /usr/apache/bin/httpd
588 /usr/apache/bin/httpd

$ isPidRunning ksh
ksh is running
5230 ksh

$ isPidRunning bash
bash is not running

Обратите внимание, что при задании сомнительного имени команды "0]" он задохнется, а также не сможет определить процессы, в именах которых есть встроенное пространство.

Также обратите внимание, что наиболее одобренное и принятое решение требует непереносимых ps опций и безвозмездно использует оболочку, которая, несмотря на свою популярность, не обязательно присутствует на каждой машине Unix / Linux (bash)

0 голосов
/ 14 ноября 2013

Этот подход можно использовать в случае, если команды 'ps', 'pidof' и rest недоступны.Лично я очень часто использую procfs в своих инструментах / скриптах / программах.

   egrep -m1  "mysqld$|httpd$" /proc/[0-9]*/status | cut -d'/' -f3

Небольшое объяснение происходящего:

  1. -m1 - остановка процесса при первом совпадении
  2. "mysqld $ | httpd $" - grep будет совпадать со строками, заканчивающимися на mysqld ИЛИ httpd
  3. / proc / [0-9] * - bash будет совпадать со строками, начинающимися с любого числа
  4. вырезать - просто разделить вывод по разделителю '/' и извлечь поле 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...