Остановка процессов при запуске сценария с несколькими командами nohup - PullRequest
0 голосов
/ 09 мая 2020

Я создал сценарий bash для запуска нескольких команд nohup для запуска процессов, однако, когда выполняется вторая команда nohup, первый процесс останавливается и так далее. Как я могу это исправить?

tp() { echo "Starting Tickerplant" ; nohup ~/q/m32/q $HomeDir"tick.q" -p $TP &> $Logs"tick.log" & }
rdb() { echo "Starting Real-Time Database" ; nohup ~/q/m32/q $FP"r.q" $TP $HDB -p $RDB &> $Logs"rdb.log" & }
fh() { echo "Starting Feedhandler" ; nohup ~/q/m32/q $FP"simpleFeed.q" &> $Logs"feed.log" & }
cep() { echo "Starting Critical Event Processer" ; nohup ~/q/m32/q $FP"cep.q" &> $Logs"cep.log" & }

Результат будет следующим:

Starting Tickerplant
[5]+  Stopped                 nohup ~/q/m32/q $HomeDir"tick.q" -p $TP >&$Logs"tick.log"
Starting Real-Time Database
[6]   Exit 1                  nohup ~/q/m32/q $FP"r.q" $TP $HDB -p $RDB >&$Logs"rdb.log"
Starting Critical Event Processer
Starting Feedhandler
FINISHED

1 Ответ

1 голос
/ 09 мая 2020

Проблема здесь в том, что фоновый процесс (в данном случае kdb) пытается читать с терминала. По умолчанию только процесс переднего плана может получить доступ к терминалу; если фоновый процесс попытается это сделать, он будет приостановлен. Вот почему вы видите

[5]+  Stopped                 nohup ~/q/m32/q $HomeDir"tick.q" -p $TP

в момент нажатия клавиши. Вам необходимо перенаправить STDIN, чтобы избежать этого:

nohup q -p ... < /dev/null &> /path/to/log

Поскольку вы этого не делаете, при запуске RDB он не может подключиться к TP (он приостановлен!) И завершает работу. Вот почему вы видите

[6]   Exit 1                  nohup ~/q/m32/q $FP"r.q" $TP $HDB -p $RDB

Поэтому убедитесь, что вы отключили стандартный ввод, потому что nohup в macOS не сделает этого за вас, в отличие от его двоюродного брата GNU / Linux.

...