在一个非常简化的场景中,我有一个如下所示的脚本:
mv test _test
sleep 10
echo $1
mv _test test
如果我执行它:
ssh localhost "test.sh foo"
只要脚本正在运行,测试文件的名称就会有一个下划线,当脚本完成后,它会发回foo
。即使您通过按ssh
终止ctrl+c
命令,或者如果您丢失了服务器的连接,脚本应该继续运行,但它不会(文件未重命名为“test”) 。所以,我尝试了以下内容:
nohup ssh localhost "test.sh foo"
它使ssh免疫ctrl+c
但是与服务器的连接仍然会导致麻烦。经过一些调试后,事实证明,如果没有ECHO,脚本将实际到达终点。当你考虑它时,它是有道理的 - 当连接断开时,不再有stdout
(ssh套接字)回显,所以它会失败,无声。
当然,我可以回显一个文件,然后获取文件,但我更喜欢更聪明的东西,沿着test tty && echo $1
(但tty
这样调用,总是返回{{1 }})。非常感谢任何建议。
答案 0 :(得分:1)
你可以使用......
ssh -t localhost "test.sh foo"
......强制进行tty分配
答案 1 :(得分:1)
以下命令可以执行您想要的操作:
ssh -t user@host 'nohup ~/test.sh foo > nohup.out 2>&1 & p1=$!; tail -f ~/nohup.out & wait $p1'
... test.sh位于用户主目录
说明:
1。)“ssh -t user @ host”......非常清楚...启动远程会话
2.)“nohup~ / test.sh foo> nohup.out 2>& 1”...启动test.sh脚本,背景为nohup
3.)“p1 = $!;” ...将前一个命令的子pid存储在p1
中
4.)“tail -f~ / nohup.out&” ...在后台尾部nohup.out查看test.sh的输出
5.)“等待$ p1”...等待proccess test.sh(pid存储在p1中)完成
即使用ctrl + c打断它,上面的命令也能正常工作。
答案 2 :(得分:0)
正如st0ne建议的那样,tail
失败,但不会导致脚本终止,而不是cat
和echo
。因此,不需要nohup
,将stdout
重定向到临时文件等等,只是简单明了:
mv test _test
sleep 10
echo $1 | tail
mv _test test
并执行:
ssh localhost "test.sh foo"