我正在尝试编写一个名为 的 Linux shell 脚本(最好是 bash),detach.sh
以安全地从终端分离程序,例如:
调用:
./detach.sh prog [arg1 arg2 ...]
。能够,
exec
例如。通过在你的 shell 中运行它:exec ./detach.sh prog [arg1 arg2 ...]
正确引用(主要是处理包含空格的参数)。
丢弃输出(因为它们是不需要的)。
不使用
screen
,tmux
等(与 4 相同的原因,加上不需要额外的保姆过程)。使用(合理地)可移植的命令和程序,而不是像
start-stop-daemon
发行版那样的东西。
我想到了几种方法(#!/bin/bash
为了简洁起见,忽略了shebang线):
nohup
:nohup "$@" >& /dev/null &
disown
:"$@" >& /dev/null & disown
setsid
:setsid "$@" >& /dev/null &
使用子外壳:
("$@" >& /dev/null &)
nohup
/setsid
结合子shell:# Or alternatively: # (nohup "$@" >& /dev/null &) (setsid "$@" >& /dev/null &)
gedit
作为测试程序使用时(代入"$@"
部分),条件1可以满足上述所有方法,但条件2可以不满足。
但是,如果将任意程序(但不是内置的 shell)附加到脚本 5,则似乎满足所有条件(至少对我gedit
而言)。例如:
(setsid "$@" >& /dev/null &)
# Not just `true' because it is also a shell builtin.
/bin/true
有人对上述现象的解释以及如何正确实施要求有所了解吗?
编辑:
对于条件 2,我的意思是程序应该与终端分离,否则照常运行。例如,对于这种情况,如果在脚本处理结束后立即退出gedit
,则条件失败。gedit