如何在不使用 -f 的情况下让 ssh 在后台运行?

vez*_*ult 5 unix ssh sh

我正在尝试创建一个 ssh 隧道,将其分离到后台进程中,然后编写一个 pid 文件,稍后我可以用它来杀死它。我可以用 运行 ssh -f,但是我没有处理它的 PID。

但是,当我尝试通过 nohup 或 setid 运行下面的脚本时,控制权永远不会返回到我尝试守护脚本的 shell。

#!/bin/sh                                                 

while getopts ":v" flag; do
    case $flag in
        v|verbose) verbose=1;;
        :) echo "option -$lastflag requires an argument"; exit 1;;
    esac 
    lastflag="$flag"
    shift $((OPTIND - 1)); OPTIND=1
done

ssh  -p '2222'  -nNL '5984:localhost:5984' 'blah@foo.com' &
pid=$!
sleep 2;
ps -p $pid >/dev/null 2>&1 || exit 1
echo $pid > "var/couchdb-tunnel.pid"
wait
Run Code Online (Sandbox Code Playgroud)

调用:

nohup script.sh
setsid script.sh
Run Code Online (Sandbox Code Playgroud)

我如何说服 ssh(我假设)放弃终端?有没有其他方法可以实现我想要的?

Kyl*_*ith 4

您正在寻找的 shell 内置命令是disown,它将后台作业重新设置为父级,init以便脚本可以退出,将它们安全地留在后台。您可能希望将输出重定向到/dev/null(或日志文件),以避免在启动脚本后在 shell 中获取输出。

ssh hostname 'command' &>/dev/null &
disown
Run Code Online (Sandbox Code Playgroud)