Проверьте, запущен ли процесс, если не запустите его снова в Терминале

2

Есть ли способ периодически проверять, запущен ли процесс (возможно, со сценарием Apple или каким-либо другим сценарием оболочки), а если нет, то выполнять его в терминале?

У меня есть скрипт PHP, который нужно запустить, но через некоторое время он ломается, поэтому мне нужно запустить его снова.

Благодарю.

depi
источник

Ответы:

5

В OSX используйте launchd для этого. launchd запустит команду при входе в систему или загрузке и, если процесс умирает, он перезапустит ее.

Процесс контролируется файлом .plist отформатированный как определено в Apple документах пример на этой странице справочника относится к делу, о котором вы просите.

  <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
   http://www.apple.com/DTDs/PropertyList-1.0.dtd >
   <plist version="1.0">
   <dict>
        <key>Label</key>
        <string>com.example.exampled</string>
        <key>ProgramArguments</key>
        <array>
             <string>exampled</string>
        </array>
        <key>KeepAlive</key>
        <true/>
   </dict>
   </plist>

Если вы хотите начать, когда пользователь входит в систему, этот файл находится в ~ / Library / LaunchAgents. Если при загрузке машины / Library / LaunchDaemons (которая не может иметь доступ к графическому интерфейсу), но он будет работать от имени пользователя root, если вы не добавите ключ UserName. (Спасибо @Gordon Davisson за исправление и перечитывание Apple определения )

Для простоты настройки .plist вы можете использовать Lingon.app доступно в Mac AppStore

Mark
источник
Исправление: чтобы запустить его при загрузке, поместите файл в / Library / LaunchDaemons.
Gordon Davisson
@ jherran посмотри мета и многие в переполнении стека мета - не используйте форматирование кода в виде простого текста только для кода
Mark
3

Если бы вы хотели сделать это с помощью сценария оболочки, я бы сделал что-то вроде этого:

#!/bin/sh
PROCESS=`ps A | grep PROCESS_NAME | grep -v grep`
if [ "$?" -ne "0" ]; then
        echo "not running"
        ### COMMAND TO EXECUTE HERE ###
        exit 1
fi

Вы можете позвонить через хрон каждую минуту или около того.

Aaron Lake
источник
2

Почему нужно активно опрашивать сценарий? Почему бы просто не поместить его в цикл сценария оболочки и перезапустить, если он потерпит неудачу.

#!/bin/sh

let c=1
while ! php -f myscript.php; do
    echo "The script has crashed $c times so far..."
    let "c=c+1"
done

В случае, если он не завершится неудачно, опрос запущенного процесса также не спасет вас. С таким же успехом он может продолжать работать, не выполняя свою работу.

m000
источник