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

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

多年来,我已经编写了相当多的 shell 脚本(但我当然不是系统管理员),但有一些事情总是给我带来麻烦:如何从后台派生一个不受挂起影响的 shell 命令?重击脚本?

例如,如果我有这个:

command_which_takes_time input > output

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

以下似乎没有达到我想要的效果:

nohup command_which_takes_time input > output &

我正在寻找的语法是什么以及我不理解的是什么?

答案1

你应该试试setsid(1)。像使用它一样使用它nohup

setsid command_which_takes_time input > output

这(根据setsid(2)手册页),执行父进程的 a fork(2), an _exit(2),然后子进程调用setsid(2)创建一个新的进程组(会话)。

你无法通过注销来杀死它,而且它不是 Bash 作业控制 shebang 的一部分。出于所有意图和目的,它是一个合适的守护进程。

答案2

尝试使用以下命令创建子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 )

答案3

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我们可以看到该作业仍在运行。

答案4

这将起作用(不要输入任何额外的空格):

command &>output.file

相关内容