Управление заданием Bash — можете ли вы завершить вторую команду в списке, не завершив первую?

#bash #background-process #job-control

#bash #фоновый процесс #управление заданием

Вопрос:

Если я выдам это в приглашении bash: $ cmd_1 ; cmd_2

cmd_1 находится на переднем плане. Могу ли я запретить запуск cmd_2 без остановки cmd_1? У меня есть время до завершения cmd_1, после чего начнется cmd_2, а затем будет слишком поздно.

Я не думаю, что это возможно, но, возможно, с помощью управления заданиями?

Отправляет ли a -Z $ bg обе команды в bg? Скорее, cmd_1 переходит в bg, а cmd_2 находится (где? «ожидающий фон?» как @ cmd?) все еще ожидаете завершения работы cmd_1?

Команды не вызывались условно, ala «cmd_1 amp;amp; cmd_2», и при этом команды не были основаны на вызове. cmd_1 выполняется в fg, cmd_2 еще не выполнен.

Проблема здесь в том, что выполнение cmd_1 займет очень много времени, cmd_2 является разрушительным, и мне бы очень не хотелось прерывать и выполнять cmd_1 снова. Я бы просто хотел, чтобы cmd_1 завершился, а cmd_2 вообще не запускался.

Я мог бы вызвать сбой cmd_2, переместив cmd_2 в cmd_2.sav, пока cmd_1 не завершится, и в результате появится сообщение «-bash: cmd_2: команда не найдена», но я надеялся на более элегантное решение. cmd_2 может использоваться другими до завершения cmd_1. (Да, я мог бы обернуть cmd_2.real в оболочку cmd_2 с помощью пользовательского теста или чего-то подобного, но этот способ является безумием).

Комментарии:

1. Ваше предположение неверно. Cmd2 будет выполняться только после завершения работы cmd1. Попробуйте cmd1 amp;amp; cmd2 запустить его только в том случае, если cmd1 завершится успешно.

2. Спасибо за разъяснение о том, когда запускается cmd_2. Вопрос предполагает, что команда вызывается, а не другой метод вызова. Вопрос заключается в том, как изменить ожидающую команду в «стеке команд» (предполагая такую вещь в интерпретаторе)

3. Я перечитываю комментарий и вижу путаницу в формулировке моего вопроса. Отредактировано.

Ответ №1:

Мог бы быть лучший способ, но это сработало бы:

  1. Нажмите Control-Z, чтобы приостановить cmd_1.
  2. начнет выполняться cmd_2. Вы можете нажать Control-C, чтобы отключить его, или вы можете выполнить свой «трюк с переименованием» перед шагом 1, чтобы у него не было шансов на запуск.
  3. Как только cmd_2 будет уничтожен / предотвращен запуск, введите fg , чтобы возобновить работу cmd_1.

Если вы хотите опробовать это заранее, чтобы убедиться, что получаемое поведение соответствует вашим ожиданиям, потренируйтесь в этом с помощью комбинации sleep echo команд и . т. Е. запускайте sleep 10; echo "hello" с терминала. Нажатие Control-Z приостанавливает выполнение команды ожидания, и выводится «привет». Ввод fg текста возобновляет режим ожидания.

Ответ №2:

В этом конкретном случае просто добавьте…

 echo "Press a key to begin... ${0}"
read
 

В начале cmd_2 . Таким образом, вы не создаете серьезных препятствий для того, кто хочет использовать cmd_2 , и даете себе шанс убить его, прежде чем он уничтожит то, что вы хотите сохранить.