Запуск нескольких команд nohup в фоновом режиме


12

Получил две команды cmd1 и cmd2. Из двух, cmd2 занимает больше времени, чтобы закончить. Необходимо запустить cmd2, а затем cmd1.

Пытался запустить их следующим образом:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

или же

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Но оба раза я вижу, что cmd1 не ждет завершения cmd2 и заполнения result1.

Как заставить cmd1 работать после cmd2, когда оба должны быть процесс nohup и работать в фоновом режиме?


Этот вопрос уже задавался unix.stackexchange.com/questions/67006/…
Рахул Патил

2
Вопрос в unix.stackexchange.com/questions/67006/… немного отличается, так как я хотел сохранить свой порядок исполнения. Пожалуйста, поправьте меня, если я ошибаюсь в понимании другого вопроса.
user33767

Ответы:


12

Ты сделал и то cmd1и другое cmd2параллельно. Вы сказали: «Запустите cmd2 в фоновом режиме и разорвите любую связь с ним. Запустите cmd1 в фоновом режиме и разорвите любую связь с ним ». Вы имели в виду: «Запустите cmd2 в фоновом режиме; когда он будет завершен, запустите cmd1 (также в фоновом режиме) ». Поскольку больше нет никакой связи с фоновой задачей, вам нужно разработать фоновую задачу, которая выполняет cmd2, а затем cmd1. Это cmd2; cmd1(или, скорее, cmd2 && cmd1запуск cmd1, только если cmd2 выполняется успешно), и вам нужно будет указать, nohupчтобы запустить оболочку, работающую в фоновом режиме для этого.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &

Спасибо. Работает нормально. Да, это то, о чем я думал, после того, как первый cmd перешел в фоновый режим, он не влияет на вторую команду, которая запускается, хотя я хотел, чтобы она дождалась окончания первой команды. Мне нужно прочитать руководство по отправке команды в фоновом режиме.
user33767

3

Если вы не возражаете против использования nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown

Проверим это. Но в настоящее время пойдет с ответом от Джайлза, где команда обернута sh. В любом случае спасибо
user33767

Это плохая идея. Когда пользователь выходит из консоли, он прерывает сеанс.
mootmoot

@mootmoot это работает как задумано, проверьте это сами; команды не получат SIGHUP при выходе из родительской оболочки.
Артем,

Да, это безопасно для оболочки, если вы запускаете команду с помощью crond / crontab. Но это не безопасно pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot

2

Просто используйте:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &

Несмотря на то, что выполнение команды несколько хорошо, я хотел сохранить точный порядок выполнения, т.е. сначала cmd2, а затем cmd1, и это не происходит с вышеуказанной командой. спасибо
user33767

0

дайте нам знать, что именно вы делаете с cmd2 и cmd1. Это зависит от типа задачи и результата, который вы хотите получить от вашей команды. Если вы столкнулись с проблемой двойного нажатия клавиши ввода с помощью команды, то это можно выяснить с помощью этого поста.

Вы также можете пойти этим путем

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Смотрите приведенный ниже снимок экрана. Здесь я использую 3 команды, и все они выполняются последовательно. Я использовал backticks для этой задачи. На скриншоте вы также можете увидеть отметку даты и времени. Команда sleep имеет 60 секунд, следовательно, через 60 секунд моя следующая команда будет выполнена успешно. Я использовал команду jobs, чтобы проверить, работает ли любая команда в фоновом режиме. Здесь нет из рабочих мест, которые вы можете увидеть это 1.

поЬир-множественная команда

Этот скриншот доступен и по этой ссылке , если его не видно

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.