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

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)


Dan*_*der 5

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:~#
Run Code Online (Sandbox Code Playgroud)

在disown后,该作业将不再与您的 shell 拥有关系(因此您甚至可以注销),并且它仍然保持运行状态直到完成。

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