Форсирование процесса в фоновом режиме из сценария Bash
Я пытаюсь создать сценарий bash, который, помимо прочего, запускает sunwait:
/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand &
Sunwait - это двоичный файл, который будет ожидать астрономических событий перед выполнением данной команды. В конце я использовал амперсанд, чтобы отправить его на задний план, чтобы мой сценарий мог продолжать делать другие вещи, но это не работает, и я не знаю почему.
Выполнение команды непосредственно на оболочке также не отправит солнечное ожидание на задний план. Я тоже попробовал nohup безуспешно.
Я на Ubuntu 14.04 Server LTS. Почему это не работает?
2 ответа
Sunwait - это двоичный файл, который будет ожидать астрономических событий перед выполнением данной команды.
После изучения вашего синтаксиса, я думаю, что эта интерпретация неверна. В вашем примере sunwait
ничего не выполняет, фактически нет команды, данной ему. Я не знаком с sunwait
, но быстрое исследование показало мне, что оно просто ждет астрономическое событие и затем заканчивается.
В вашем случае это выглядит так:
- Оболочка читает строку, встречает точку с запятой
;
и выполняет все к этому моменту - этоsunwait
с его параметрами командной строки. - Оболочка ждет
sunwait
заканчивать. - В конце концов
sunwait
заканчивается, поэтому оболочка переходит кmycommand
и выполняет его в фоновом режиме из-за амперсанда&
,
Таким образом, прямой ответ на ваш вопрос является наиболее распространенным: он не "работает" (не делает то, что вы хотите), потому что он работает (делает то, что вы командуете).
Fix:
Или
{ /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand; } &
или же
/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E && mycommand &
В первой строке две команды внутри {}
по-видимому &
как будто это была одна команда, так что все идет на задний план. Просто и часто достаточно хорошо. Второй случай немного отличается: mycommand
будет работать, если и только если sunwait
заканчивается без ошибок (если sunwait
плохо закодировано). Это поведение, которое вы ожидали в первую очередь, не так ли? Лично я нахожу второе исправление более элегантным. Представьте, что вы ошиблись, набрав mycommand
и через некоторое время понял, что это бомба замедленного действия. Убийство sunwait
запустит бомбу в первом сценарии, обезвредит во втором.
В вашей строке две команды, разделенные точкой с запятой (;
). Вам нужно либо отправить обе команды в фоновом режиме:
/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E & mycommand &
Или, если вы хотите, чтобы команды выполнялись одна за другой, запустите их как в подоболочке, так и в фоновом режиме, которые:
( /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand ) &
Я полагаю, что последний пример - это то, чего вы пытаетесь достичь, поскольку первый запустит обе команды прямо сейчас и справится с ними.