Хотя pidof
и pgrep
являются отличными инструментами для определения того, что работает, они, к сожалению, недоступны в некоторых операционных системах. Определенный отказоустойчивый будет использовать следующее: ps cax | grep command
Вывод в Gentoo Linux:
14484 ? S 0:00 apache2
14667 ? S 0:00 apache2
19620 ? Sl 0:00 apache2
21132 ? Ss 0:04 apache2
Выход на OS X:
42582 ?? Z 0:00.00 (smbclient)
46529 ?? Z 0:00.00 (smbclient)
46539 ?? Z 0:00.00 (smbclient)
46547 ?? Z 0:00.00 (smbclient)
46586 ?? Z 0:00.00 (smbclient)
46594 ?? Z 0:00.00 (smbclient)
Как в Linux, так и в OS X, grep возвращает код завершения, поэтому легко проверить, был ли найден процесс:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
Кроме того, если вам нужен список идентификаторов PID, вы также можете легко их найти:
ps cax | grep httpd | grep -o '^[ ]*[0-9]*'
Чей вывод одинаков в Linux и OS X:
3519 3521 3523 3524
Вывод следующего является пустой строкой, что делает этот подход безопасным для процессов, которые не запущены:
echo <code>ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'</code>
Этот подход подходит для написания простого теста пустой строки, а затем итерации по обнаруженным идентификаторам PID.
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
Вы можете проверить это, сохранив его в файл (с именем «running») с разрешениями на выполнение (chmod + x running) и выполнив его с параметром: ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
ВНИМАНИЕ !!!
Имейте в виду, что вы просто анализируете вывод ps ax
, что означает, что, как видно из вывода Linux, он не просто совпадает с процессами, но и с аргументами, переданными этой программе. Я настоятельно рекомендую при использовании этого метода быть как можно более точным (например, ./running "mysql"
также будет соответствовать процессам mysqld). Я настоятельно рекомендую использовать which
для проверки полного пути, где это возможно.
Ссылка:
http://linux.about.com/od/commands/l/blcmdl1_ps.htm
http://linux.about.com/od/commands/l/blcmdl1_grep.htm