#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:
Мог бы быть лучший способ, но это сработало бы:
- Нажмите Control-Z, чтобы приостановить cmd_1.
- начнет выполняться cmd_2. Вы можете нажать Control-C, чтобы отключить его, или вы можете выполнить свой «трюк с переименованием» перед шагом 1, чтобы у него не было шансов на запуск.
- Как только 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
, и даете себе шанс убить его, прежде чем он уничтожит то, что вы хотите сохранить.