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

我正在尝试创build一个SSH隧道,把它closures到一个后台进程,并写一个PID文件,我可以稍后用它来杀死它。 我可以用-f运行ssh,但是我没有处理它的PID。

但是,当我尝试通过nohup或setsid运行下面的脚本时,控制永远不会返回到我尝试守护该脚本的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' '[email protected]' & pid=$! sleep 2; ps -p $pid >/dev/null 2>&1 || exit 1 echo $pid > "var/couchdb-tunnel.pid" wait 

调用:

 nohup script.sh setsid script.sh 

我怎么说服ssh(我想)放开terminal? 有其他的方式可以完成我想要的吗?

你正在寻找的shell内build是disown ,重新父母后台作业init ,使脚本可以退出离开他们安全地在后台。 您可能希望将输出redirect到/dev/null (或日志文件),以避免启动脚本后在shell中输出。

 ssh hostname 'command' &>/dev/null & disown 

是不是wait导致您的脚本等待? 从手册页…

等待[n …]等待每个指定的进程并返回其终止状态。 每个n可以是一个进程ID或一个作业规范; 如果给出了工作规范,则等待该作业pipe道中的所有进程。 如果没有给出n,则等待所有当前活动的subprocess,并且返回状态为零。 如果n指定不存在的进程或作业,则返回状态为127.否则,返回状态为最后一个进程或作业等待的退出状态。

所以你的脚本正在等待ssh隧道完成,然后再返回到提示符。 只要删除wait ,你会得到一个提示,你的隧道将在后台运行。

我使用screen在同一个terminal窗口中运行不同的连接和脚本。 这也可以让我closures我的机器,回家,打开我的机器,重新加载screen会话,我想保持监视正在发生的事情。

当然,这是假设我从terminalSSH'd到另一台机器。