Как полностью разветвить команду оболочки, которая использует перенаправление

13

Я написал довольно много сценариев оболочки за эти годы (но я определенно не являюсь системным администратором), и есть кое-что, что всегда доставляло мне неприятности: как я могу развить команду оболочки, невосприимчивую к зависаниям в фоновом режиме, из сценария Bash ?

Например, если у меня есть это:

command_which_takes_time input > output

Как я могу "nohup" и разветвить это?

Следующее, кажется, не делает то, что я хочу:

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)странице руководства), делает fork(2), _exit(2)родительский процесс, то вызовы дочернего процесса , setsid(2)чтобы создать новую группу процесса (сеанс).

Вы не можете убить это, выйдя из системы, и это не часть шебанга по контролю за работой Bash. Для всех намерений и целей, это настоящий демон.

Алексиос
источник
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:~#

После отречения , задание отменяется из вашей оболочки (так что вы даже можете выйти из системы), и оно все еще остается выполненным до завершения.

Смотри 1-ую jobsкоманду в списке, а sleep2-ую jobsпосле отречения нет. Но с помощью psмы можем видеть, что работа все еще выполняется.

Даниэль Педер
источник
2

Freebsd:

/usr/sbin/daemon -f <command> <command args>
h0tw1r3
источник
-2

Это будет работать (не вводите лишние пробелы):

command &>output.file
Дэвид
источник
1
Похоже, что это не имеет ничего общего с вопросом, потому что он не развивается и не достигает эквивалента nohup.
Дэн Гетц