多年来,我已经编写了相当多的 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
有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:~#
后否认,该作业与您的 shell 无关(因此您甚至可以注销),并且它仍然保持运行直到完成。
jobs
请参阅列出的第一个命令sleep
,但是否认后的第二个命令jobs
没有列出。但使用ps
我们可以看到该作业仍在运行。
答案4
这将起作用(不要输入任何额外的空格):
command &>output.file