Как проверить, запущен ли процесс в Linux

Я пытаюсь автоматически проверять, работает ли процесс или нет, и выполнить соответствующие шаги соответственно. Я написал bash script, но он не работает.

if ps aux | grep [M]yProcessName > /dev/null
then
  echo "Running"
else
  echo "Not running"
fi

Является ли мой оператор if неправильным использованием?

Ответ 1

Вы не хотите знать, работает ли какой-либо конкретный процесс (известного pid) (это можно сделать, проверяя, существует ли /proc/1234/ для pid 1234), но если какой-либо процесс выполняет заданную команду (или заданную исполняемый файл).

Обратите внимание, что kill (2) syscall может быть портативно использован для проверки того, работает ли данный процесс (с сигналом 0, например kill(pid,0)). Изнутри программы это обычный способ проверить, что процесс известного pid все еще существует и работает (или ждет).

Вы можете использовать команду pidof, чтобы найти процессы, выполняющие некоторый исполняемый файл, например. pidof zsh, чтобы найти все процессы zsh. Вы также можете использовать killall -s 0 zsh

И вас может заинтересовать утилита pgrep и файловая система /proc.

Ответ 2

ps aux | grep [M]yProcessName | grep -v grep

Ответ 3

Существует решение:

if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then ... elif [ ... ]; then ... else ... fi

Это отлично работает в Debian 6. "{print $11}" необходимо, потому что sytem рассматривает grep как процесс, а также

Ответ 4

processid =$(ps aux | grep 'ProcessName' | grep -v grep| awk '{print $2}')

Приведенная выше команда даст вам идентификатор процесса. Назначьте этот идентификатор процесса переменной и сделайте это →

if cat /proc/$processid/status | grep "State:  R (running)" > /dev/null
then
  echo "Running"
else
  echo "Not running"
fi

Ответ 5

Используя -z, чтобы проверить, является ли строка пустой или нет, возможно, что-то вроде этого:

line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
    echo "Not Running"
else
    echo $line > /dev/null
    echo "Rinnung"
fi

Ответ 6

В моей системе ps aux | grep ProcessName всегда получает строку этого процесса grep, например:

edw4rd     9653  0.0  0.0   4388   832 pts/1    S+   21:09   0:00 grep --color=auto ProcessName

Итак, статус выхода всегда 0. Возможно, поэтому ваш script не работает.

Ответ 7

SMBD=$(pidof smbd)
if [ "$SMBD" == "" ];
then
   /etc/init.d/samba start;
else
   /etc/init.d/samba restart;
fi

Ответ 8

return 0 означает успех, а другие не удалось

kill -0 `pid`; echo $?

Ответ 9

попробуйте это

ps aux | grep [M]yProcessName | grep -v grep