我正在尝试编写一个名为 的 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 & disownsetsid: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