我试着写一个Linux shell脚本(最好是bash)的,按说命名detach.sh
,安全地分离从终端程序,使得:
调用:
./detach.sh prog [arg1 arg2 ...]
是
exec
-able,例如。 通过在shell中运行这个:exec ./detach.sh prog [arg1 arg2 ...]
通过适当的引用(主要是处理含有空格参数)。
丢弃该输出(因为它们是不需要的)。
不使用
screen
,tmux
等(同样的原因有4个,再加上无需额外的保姆的过程)。用途(合理的),便携命令和程序,以及不一样的东西
start-stop-daemon
这是相当发行特定的。
我想到了几种方法(家当线#!/bin/bash
忽视为了简洁起见):
nohup
:nohup "$@" >& /dev/null &
disown
:"$@" >& /dev/null & disown
setsid
:setsid "$@" >& /dev/null &
使用子shell:
("$@" >& /dev/null &)
nohup
/setsid
与子外壳组合:# 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
只是退出脚本的过程结束后,立即权利。