Скрипт для проверки работоспособности приложения; если нет, начни - PullRequest
0 голосов
/ 06 июля 2019

Я запускаю приложение «OsiriX MD» на моем Mac. Иногда это необъяснимо "уходит". Я хочу запускать скрипт каждый час, чтобы проверить, работает ли он. Если нет, я хочу перезапустить его. Будет ли это работать?

#!/bin/bash
PROCESS=OsiriX MD
number=$(ps aux | grep $PROCESS | wc -l)

if [ $number -gt 0 ]
then
    open $PROCESS;
fi

Ответы [ 3 ]

1 голос
/ 06 июля 2019

Я предлагаю использовать pgrep, чтобы проверить, не запущен ли процесс (!):

process="OsiriX MD"
if ! pgrep -f "$process"; then
  echo "start application"
fi

См .: man pgrep

0 голосов
/ 11 июля 2019

До сих пор я имел успех с этим кодом:

#!/bin/bash process="OsiriX\ MD" if ! pgrep -f "$process"; then open -a /Applications/OsiriX\ MD.app/Contents/MacOS/OsiriX\ MD; fi

Кто-нибудь видит потенциальную проблему с ним?

Спасибо за ваши предложения.

Howard

0 голосов
/ 07 июля 2019

Может пригодиться утилита watershed (в дистрибутивах на основе Debian она устанавливается с apt install watershed),

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

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

watershed "OsiriX MD" &

Или, если OsiriX MD нужен сам терминал:

watershed "OsiriX MD"

Сохраняет специальный файл блокировки в ~/.watershed/, который позже будет проверен watershed. Если OsiriX MD все еще работает, watershed будет ждать, пока не работает, а затем запустить его. Если OsiriX MD не запущен, то watershed запускает его.

Одна очевидная ошибка: третьи экземпляры, похоже, игнорируются. Например, предположим, что мы запускаем watershed mc на терминале A, затем на терминале B, затем на терминале C. Мы увидим mc на A, watershed mc на B & C, оба ожидают. Теперь закройте mc на A, и на B мы увидим новый экземпляр mc, а на C watershed mc все еще ждет. Теперь закройте mc на B, и C покажет командную строку - третий экземпляр ждал без дела. С другой стороны, если бы мы подождали, пока мы закроем mc на A, , тогда запустим watershed mc на C, затем закроем mc на B, тогда mc будет на C. Два экземпляра работают нормально.

...