如何完全分叉使用重定向的Shell命令


13

这些年来,我已经写了很多shell脚本(但是我当然不是系统管理员),总有一些问题引起我的麻烦:如何从Bash脚本中派生出免于后台挂断的shell命令?

例如,如果我有这个:

command_which_takes_time input > output

我怎样才能“ nohup”并分叉呢?

以下内容似乎并没有满足我的要求:

nohup command_which_takes_time input > output &

我要寻找的语法是什么,我不了解什么?

Answers:


13

尝试使用创建子shell (...)

( 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

disownbash内置命令:

[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:~#

不认,这项工作是从你的shell否认(所以你甚至可以注销),它仍然会继续运行,直到完成。

请参阅jobs列出的第一个命令,sleep但是第二个命令未列出jobs。但是使用,ps我们可以看到作业仍在运行。


2

Freebsd:

/usr/sbin/daemon -f <command> <command args>

-2

这将起作用(不要键入任何多余的空格):

command &>output.file

1
这似乎与问题无关,因为它不会分叉或达到nohup
Dan Getz 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.