2016-03-03 2 views
0

Привет, я пытаюсь проверить, запущен процесс, и если это так, перезапустите его. Но если это не так, начните. Сценарий запускается после того, как команда команд была выполнена удаленно с Windows-машины с использованием Plink. Затем я запускаю другую команду plink для запуска этого скрипта. Приложение на главной машине работает постоянно.Перезапустить процесс, если он запущен в Bash

SERVICE="./Snowflake.app/Contents/MacOS/Snowflake" 

if pgrep "$SERVICE" >/dev/null 2>&1 ; 
then 
echo "$SERVICE is running" 
pkill "$SERVICE" 
else 
    /Applications/snowflake/run.sh 

fi 

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

ответ

1

Я предлагаю просто, глупо убить процесс и проверить сообщение об ошибке, например No process found (что в данном случае не является ошибкой).

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

+0

Извините, что не работает, по-прежнему та же проблема – Eggfoot

+0

О, извините, мне пришлось снова поставить pkill, да, вы правы, это глупо. – Eggfoot

+0

На самом деле это не глупо *. Это безопасно против условий гонки .. :) – hek2mgl

-1

Проблема в том, что вы отправили все выходные данные из pgrep в/dev/null Оставьте это просто, и он будет работать. (проверено!)

+0

Перенаправление вывода команды не изменяет значение '$?', Что и проверяется 'if'. – miken32

Смежные вопросы