Ced*_*tin 15 scripting bash nohup fork
这些年来我写了很多 shell 脚本(但我肯定不是系统管理员),而且总是有一些事情给我带来麻烦:如何从Bash脚本中分出一个不受后台挂起影响的 shell 命令?
例如,如果我有这个:
command_which_takes_time input > output
Run Code Online (Sandbox Code Playgroud)
我怎样才能“nohup”并分叉这个?
以下似乎没有做我想要的:
nohup command_which_takes_time input > output &
Run Code Online (Sandbox Code Playgroud)
我正在寻找的语法是什么,我不明白什么?
Ale*_*ios 21
你应该试试setsid(1)
。像使用它一样使用它nohup
:
setsid command_which_takes_time input > output
Run Code Online (Sandbox Code Playgroud)
这(根据setsid(2)
联机帮助页),执行父进程的fork(2)
, an _exit(2)
,然后子进程调用setsid(2)
以创建新的进程组(会话)。
你不能通过注销来终止它,它不是 Bash 作业控制 shebang 的一部分。出于所有意图和目的,它是一个合适的守护进程。
Grz*_*cki 15
尝试使用以下命令创建子shell (...)
:
( command_which_takes_time input > output ) &
Run Code Online (Sandbox Code Playgroud)
例子:
~$ ( (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 )
Run Code Online (Sandbox Code Playgroud)
有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:~#
Run Code Online (Sandbox Code Playgroud)
在disown后,该作业将不再与您的 shell 拥有关系(因此您甚至可以注销),并且它仍然保持运行状态直到完成。
请参阅列出的第一个jobs
命令,sleep
但是否认后的第二个命令jobs
没有列出。但使用ps
我们可以看到该作业仍在运行。