Як повністю розщедрити команду оболонки, яка використовує перенаправлення


13

Я написав досить багато скриптів оболонки протягом багатьох років (але я, звичайно, не системний адміністратор), і є щось, що завжди спричиняло мені проблеми: як я можу розщедрити команду оболонки, захищену від зависання на задньому плані зі сценарію Bash ?

Наприклад, якщо у мене це є:

command_which_takes_time input > output

Як я можу "нохуп" і роздрібнити це?

Наступне, здається, не робить те, що я хочу:

nohup command_which_takes_time input > output &

Що таке синтаксис, який я шукаю, а що я не розумію?

Відповіді:


13

Спробуйте створити додаткову оболонку за допомогою (...):

( command_which_takes_time input > output ) &

Приклад:

~$ ( (sleep 10; date) > /tmp/q ) &
[1] 19521
~$ cat /tmp/q # ENTER
~$ cat /tmp/q # ENTER
(...) #AFTER 10 seconds
~$ cat /tmp/q #ENTER
Wed Jan 11 01:35:55 CET 2012
[1]+  Done                    ( ( sleep 10; date ) > /tmp/q )

18

Спробуйте спробувати setsid(1). Використовуйте його, як і раніше nohup:

setsid command_which_takes_time input > output

Це (відповідно до сторінки сторінки setsid(2)) виконує a fork(2), _exit(2)батьківський процес, тоді дочірній процес вимагає setsid(2)створити нову групу процесів (сеанс).

Ви не можете вбити це, вийшовши з системи, і це не є частиною шебангу управління роботою Баша. Для всіх намірів і цілей це правильний демон.


4

є disownкоманда bash вбудована:

[1] 9180
root@ntb1:~# jobs
[1]+  Running                 sleep 120 &
root@ntb1:~# disown
root@ntb1:~# jobs
... no jobs, disowned
root@ntb1:~# ps aux | grep sleep | grep -v grep
root      9180  0.0  0.0   4224   284 pts/0    S    17:55   0:00 sleep 120
... but the sleep still runing
root@ntb1:~#

Після відмови від роботи відхиляється від вашої оболонки (так що ви навіть можете вийти з системи), і вона все ще працює до кінця.

Дивіться, що перша jobsкоманда перераховує, sleepоднак, друга jobsпісля відмови від цього не зробила. Але за допомогою програми psми бачимо, що робота все ще виконується.



-2

Це спрацює (не вводьте зайвих пробілів):

command &>output.file

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