Jak całkowicie rozwidlić polecenie powłoki korzystające z przekierowania

13

Przez lata napisałem sporo skryptów powłoki (ale z pewnością nie jestem sysadminem) i jest coś, co zawsze sprawiało mi kłopoty: jak mogę rozwidlić polecenie powłoki odporne na zawieszanie się w tle ze skryptu Bash ?

Na przykład, jeśli mam to:

command_which_takes_time input > output

Jak mogę „nohup” i rozwidlić to?

Następujące czynności nie wydają się robić, co chcę:

nohup command_which_takes_time input > output &

Jakiej składni szukam, a czego nie rozumiem?

Cedric Martin
źródło

Odpowiedzi:

13

Spróbuj utworzyć podpowłokę za pomocą (...):

( command_which_takes_time input > output ) &

Przykład:

~$ ( (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 )
Grzegorz Wierzowiecki
źródło
18

Powinieneś spróbować setsid(1). Używaj go tak, jakbyś używał nohup:

setsid command_which_takes_time input > output

To (zgodnie z setsid(2)podręcznika), robi fork(2), _exit(2)procesu macierzystego, a następnie wywołania procesu dziecko setsid(2), aby utworzyć nową grupę procesów (sesja).

Nie możesz tego zabić, wylogowując się, i to nie jest część przekleństwa kontroli zadań Bash. Pod każdym względem jest to właściwy demon.

Alexios
źródło
4

jest disownwbudowane polecenie 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:~#

Po wyprzeć , zadanie jest wyparł ze swojej skorupy (więc można nawet wylogowania) i nadal pozostaje uruchomiony dopiero wykończone.

Zobacz pierwsze jobspolecenie wymienione, sleepjednak drugie jobspo odrzuceniu nie. Ale za pomocą psmożemy zobaczyć, że zadanie nadal działa.

Daniel Péder
źródło
2

Freebsd:

/usr/sbin/daemon -f <command> <command args>
h0tw1r3
źródło
-2

To zadziała (nie wpisuj żadnych dodatkowych spacji):

command &>output.file
David
źródło
1
Wydaje się, że nie ma to nic wspólnego z pytaniem, ponieważ nie rozwidla ani nie osiąga odpowiednika nohup.
Dan Getz