Как я могу перезапустить процесс только в случае его сбоя, но не в том случае, если он завершается нормально (или с определенными кодами возврата)?

1

У меня странная проблема, которая, вероятно, связана с инициализацией оборудования. Я работаю над системой автоматического сбора данных на основе Java, которая работает на SBC с Ubuntu 16.04. На данный момент программа сбора данных запущена через cron, хотя я планирую перейти на systemd.

Он запускается и работает нормально, если я перезагружаю систему. Однако, если он выключен и запущен холодным способом (что является нормальным способом), программа вылетает с ошибкой free(): corrupted unsorted chunks. Если я начну это снова, это, кажется, работает хорошо. Мне нужно выяснить, почему и, надеюсь, будет, но это может занять некоторое время, и в то же время система нуждается в дальнейшем тестировании, и мне нужен обходной путь, который перезапустит ее в случае сбоя. Просто добавление задержки не помогает.

Я хотел бы перезапустить процесс Java или перезагрузить систему из сценария оболочки bash, но только в случае сбоя. Если он завершается с нулевым кодом выхода (или, в идеале, с любым кодом из заранее определенного набора допустимых кодов выхода), он не должен быть перезапущен, и сценарий также должен завершиться.

biggvsdiccvs
источник

Ответы:

3

Если вы можете написать сценарий Bash, запланируйте этот сценарий вместо вашей программы:

#!/bin/bash
myprogram
while [ $? -ne 0 ]; do
    myprogram
done

Этот скрипт перезапустит вашу программу до тех пор, пока он не завершится с кодом ошибки 0 (указывающим на успех). Кроме того, перезагрузка всей системы кажется мне немного излишней.

Натан. Эйлиша Шираини
источник
Большое спасибо! Я полагаю, что мог бы использовать ifи breakи изменить это на эквивалент цикла do-while и вызывать программу только в одном месте (в ней есть несколько аргументов, которые я бы не хотел повторять) и регистрировать код выхода $?. Существует ли простой и элегантный способ использования набора допустимых кодов выхода (кроме, например, логических операторов [ $? -ne 0 ] && [ $? -ne 73])?
biggvsdiccvs
Мне приходит в голову мысль использовать список кодов выхода и проверить, есть ли $?в этом списке. Однако решение, предложенное stackoverflow.com/a/8063398/4482039 , не является тем, что я лично назвал бы «простым» ... Что касается проблемы неповторения аргументов, их можно сохранить (или всю командную строку). переменная. Я не фанат поддельных do...whileпетель, но это личное мнение.
Натан. Илиша Ширайни