Shell:Fork(daemonize)子Shell,使其能够在其tmux会话结束后生存
我正在尝试派生一个子shell,该子shell在创建它的tmux会话终止后仍然存在。我尝试了一种双叉策略:Shell:Fork(daemonize)子Shell,使其能够在其tmux会话结束后生存,shell,fork,zsh,daemon,tmux,Shell,Fork,Zsh,Daemon,Tmux,我正在尝试派生一个子shell,该子shell在创建它的tmux会话终止后仍然存在。我尝试了一种双叉策略: insubshell-eval () { local cmd="$@" ( eval "$cmd" ) } gquote () { # quotes the arguments print -r -- "${(q+@)@}" } awaysh1 () { local
insubshell-eval () {
local cmd="$@"
(
eval "$cmd"
)
}
gquote () {
# quotes the arguments
print -r -- "${(q+@)@}"
}
awaysh1 () {
local cmd="$(gquote "$@") & ; disown "
setopt LOCAL_OPTIONS NO_NOTIFY NO_MONITOR
insubshell-eval "$cmd" &
&> /dev/null < /dev/null || return $?
disown &> /dev/null || true
}
awaysh-exit () {
awaysh1 "$@"
exit 0
}
awaysh-doublefork () {
awaysh1 awaysh-exit "$@"
}
这个命令有竞争条件(我不知道为什么),有时会正确地播放文件,更多的时候不会播放任何内容
我唯一想到的是,双分叉进程仍然与原始进程共享其进程组ID,因此tmux会向遗忘发出信号。但是如何更改此进程ID
附言:我不能使用nohup。我希望解决方案处于纯
zsh
中,使用nohup
在生成它的shell死亡后让进程继续运行。它必须是一个过程,而不是一个子shell
$man nohup
如何使用的快速示例:
$nohup程序参数&
PS:我不能用nohup。我希望解决方案是纯zsh。
在这个问题上。Nohup
不是bash的一部分,它是一个单独的程序,几十年来一直是*nix(UNIX、Linux和friends)的一部分,比如grep
和sed
。我知道。我不想使用unix二进制文件。原因是程序本身就是一个zsh函数,不,我不能用zsh-c
执行这个函数,这很奇怪。
tmux kill-ses -t t1 ; tmux new-session -d -s t1 zsh -c "awaysh-doublefork play '/x/y.ogg'"