Вы можете использовать killall или kill, в зависимости от того, пытаетесь ли вы найти задачу по PID или по имени.
По имени:
if ! killall -s -0 $PROCESS_NAME >/dev/null 2>&1; then
# Restart failed app, or do whatever you need to prepare for starting the app.
else
at -f $0 +30seconds # If you don't have this on cron, you can use /usr/bin/at
fi
По PID:
if ! kill -0 $PID 2>/dev/null; then
# Restart app, do the needful.
else
at -f $0 +30seconds
fi
Если вы посмотрите Руководство по OSX , вы увидите другой набор команд управления процессами; поскольку это не ядро Linux, имеет смысл, что они будут управлять процессами по-другому.
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/killall.1.html
Пример вывода с моего терминала (конечно, вычеркивая имя пользователя и хоста):
user@localhost:~$ kill -0 782 # This was my old, stale SSH Agent.
bash: kill: (782) - No such process
user@localhost:~$ echo $?
1
user@localhost:~$ kill -0 813 # This is my new SSH agent, I only just created.
user@localhost:~$ echo $?
0
Код возврата из kill -0 всегда будет безопасным способом проверять, запущен ли процесс, потому что -0 не отправляет сигнал, который когда-либо будет обработан приложением. Это не убьет приложение, а «kill» называется только «kill», потому что обычно оно используется для остановки приложения.
Когда вы посмотрите на интерфейсы, которые он использует в источнике, вы увидите, что он на самом деле напрямую взаимодействует с таблицей процессов (а не очищает потенциально загруженный вывод из ps) и просто отправляет сигнал приложению. Некоторые сигналы указывают на то, что приложение должно завершать работу или останавливаться, в то время как другие сигналы говорят ему перезапустить службы, либо перечитать конфигурацию, либо заново открыть дескрипторы файлов, чтобы записывать файлы, которые были недавно повернуты. Существует множество вещей, которые «kill» и «killall» могут делать, которые не завершают работу приложения, и регулярно используются для простой отправки сигнала приложению.