Помимо уже упомянутой синтаксической ошибки, это паршивый способ гарантировать, что процесс остается живым.
Во-первых, вы должны выяснить, почему ваша программа в первую очередь умирает; этот скрипт не исправляет ошибку, он пытается ее скрыть.
Во-вторых, если это так важно, чтобы программа продолжала работать, почему вы ожидаете, что ваш (по крайней мере, один раз) скрипт с ошибкой оболочки выполнит эту работу? Используйте системное средство, специально предназначенное для перезапуска серверных процессов. Если вы говорите, какую платформу вы используете, и характер вашего серверного процесса. Могу предложить более конкретный совет.
добавлено в ответ на комментарий :
Конечно, есть технические трудности, но, как отмечено в ОП, в этой попытке решения все еще есть ошибка:
Я знаю, я должен проверить по имени процесса
а не идентификатор процесса, так как другой
процесс может вскочить и взять идентификатор.
Так что теперь у вас есть скрипт отслеживания PID, а не процесс "няня". Хотя шансы невелики, сценарий в его нынешнем виде имеет окно длиной в десять секунд, в котором
- «отслеживаемый» процесс завершается неудачей
- Я запускаю свой недельный процесс emacs, который получает тот же PID
- сценарий няни продолжает блаженно не подозревая, что его зависимый не удалось
Скрипт не просто глючит, он недействителен, поскольку предполагает, что PID являются стабильными идентификаторами процесса. Есть способы, которыми это может быть лучше обработано даже на уровне сценария оболочки. Самое простое - никогда не отсоединять выполнение perl
от сценария, поскольку сценарий не выполняет ничего, кроме наблюдения за подпроцессом. Например:
while true ; do
if perl program_name.pl ; then
echo "program_name terminated normally, restarting"
else
echo "oops program_name died again, restarting"
fi
done
Что не только короче и проще, но и фактически блокирует условие, которое вас действительно интересует: состояние выполнения perl-программы. Исходный сценарий неоднократно проверяет неверное указание прокси-сервера о состоянии состояния выполнения (PID) и поэтому может ошибиться. И, поскольку вся цель этого скрипта няни состоит в том, чтобы обрабатывать ошибки, было бы плохо, если бы он был сам по себе дефектным.