我正在尝试创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到另一台机器。