Форсирование процесса в фоновом режиме из сценария Bash

476
Niksac

Я пытаюсь создать сценарий bash, который, помимо прочего, запускает sunwait:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand & 

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

Выполнение команды непосредственно на оболочке также не отправит солнечное ожидание на задний план. Я тоже попробовал nohup безуспешно.

Я на Ubuntu 14.04 Server LTS. Почему это не работает?

0

2 ответа на вопрос

1
Kamil Maciorowski

Sunwait - это двоичный файл, который будет ожидать астрономических событий перед выполнением данной команды.

После изучения вашего синтаксиса, я думаю, что это неверное толкование. В вашем примере sunwaitничего не выполняется, на самом деле ему не дана команда. Я не знаком с этим sunwait, но быстрое исследование показало мне, что оно просто ждет астрономическое событие и затем заканчивается.

В вашем случае это выглядит так:

  • Оболочка читает строку, встречает точку с запятой ;и выполняет все до этого момента - то есть sunwaitс ее параметрами командной строки.
  • Раковина ждет, sunwaitчтобы закончить.
  • В конце концов sunwaitзавершается, поэтому оболочка переходит к ней mycommandи выполняет ее в фоновом режиме из-за амперсанда &.

Таким образом, прямой ответ на ваш вопрос является наиболее распространенным: он не «работает» (не делает то, что вы хотите), потому что он работает (делает то, что вы командуете).

Fix:

  1. Или { /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand; } &

  2. или же /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E && mycommand &

В первой строке две команды внутри {}выглядят так, &как будто это одна команда, поэтому все идет к фону. Просто и часто достаточно хорошо. Второй случай немного отличается: он mycommandбудет работать тогда и только тогда, когда завершится sunwaitбез ошибок (если только sunwaitон плохо закодирован). Это поведение, которое вы ожидали в первую очередь, не так ли? Лично я нахожу второе исправление более элегантным. Представьте, что вы ошиблись, набрав текст, mycommandи через некоторое время поняли, что это бомба замедленного действия. Убийство sunwaitвызовет бомбу в 1-м сценарии, обезвредит его во 2-м.

спасибо за подробное объяснение и за обсуждение возможных исправлений !! Я чувствую себя немного глупо, и && работает как шарм :) Niksac 9 лет назад 0
1
Thomas Guyot-Sionnest

В вашей строке две команды, разделенные точкой с запятой ( ;). Вам нужно либо отправить обе команды в фоновом режиме:

/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 ) & 

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

Похожие вопросы