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


12

Отримав дві команди cmd1 та cmd2. З двох, cmd2 займає більше часу, щоб закінчити. Потрібно запустити cmd2, а потім cmd1.

Спробував запустити їх наступним чином:

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

або

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

Але я бачу, що cmd1 не чекає завершення cmd2 і результат1 заповнюється.

Як змусити cmd1 запуститись після cmd2, коли обидва повинні бути nohup-процесами та працювати у фоновому режимі?


Це питання вже задають unix.stackexchange.com/questions/67006/…
Rahul Patil

2
Питання в unix.stackexchange.com/questions/67006/… дещо інше, оскільки я хотів підтримувати свій порядок виконання. Будь ласка, виправте мене, якщо я помиляюся в розумінні іншого питання.
користувач33767

Відповіді:


12

Ви зробили обоє cmd1і cmd2біжите паралельно. Ви сказали: «Запустіть cmd2 у фоновому режимі і розірвіть будь-яку асоціацію з ним. Запустіть cmd1 на задньому плані та розірвіть будь-яку асоціацію з ним. " Ви мали на увазі: «Почніть cmd2 у фоновому режимі; по завершенні запустіть cmd1 (також у фоновому режимі). " Оскільки більше не існує асоціації з фоновим завданням, вам потрібно розробити фонове завдання, яке виконує cmd2, а потім cmd1. Це cmd2; cmd1(а точніше, cmd2 && cmd1запустити cmd1, лише якщо cmd2 вдасться), і вам потрібно буде сказати, nohupщоб запустити оболонку, що працює у фоновому режимі для цього.

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

Thanks. It is working fine. Yeah, thats what I was thinking , after making the first cmd go to background, it does not affect the second command, which starts even though I wanted it to wait for the first command to finish. I need to read the manual about sending command to background.
user33767

3

If you don't mind not using nohup:

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

Will check that out. But currently will go with answer from Giles where the command is wrapped with sh. Thanks anyway
user33767

This is a bad idea. When user logout from the console, it will kill the session.
mootmoot

@mootmoot this works as intended, check this for yourself; commands won't receive SIGHUP when parent shell exits.
artyom

Yes, it is shell safe if you run the command using crond/crontab. But it is not pty/xterm/ssh safe. unix.stackexchange.com/questions/3886/…
mootmoot

2

Simply use :

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

While running the multiple command is fine, I wanted to maintain the exact order of execution i.e. cmd2 first and then cmd1 and it is not happening with the above command. thanks
user33767

0

let us know what exactly you are doing with cmd2 and cmd1 . It depend upon type of task and output you want from your command. If you are facing issue with hitting two times enter key with command then it can be figure out by my this post

you can go by this way also

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

See the below given screenshot, Here I am using 3 commands and all are executing one by one serially. I used backticks for this task. In screenshot you can also observe the date time stamp. sleep command has 60 seconds,hence after 60 seconds my next command is run successfully. I used jobs command to check is any command still running at background. Here no. of jobs you can see is 1 .

nohup-multiple-command

This screenshot is available in this link also,if it is not visible

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.