Как проверить, запущен ли процесс в 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