Shell:Fork(daemonize)子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

我正在尝试派生一个子shell,该子shell在创建它的tmux会话终止后仍然存在。我尝试了一种双叉策略:

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'"