怎么通过ssh来执行远端脚本

2013-01-04 22:53:27 +08:00
 pythonee
因为是内部环境,所以我配置了公钥无密码两台机器互相ssh登陆

我的意图主要是,通过ssh远程连接到服务器,重启上面的服务,重启完之后,进行一些脚本测试。

假设这个远端脚本就叫restart.sh,执行他会在控制台输出一些东西,问题来了,我如果在客户机下

ssh user@host "~/restart.sh"

这样的话,一旦连接就会发生,客户机上的脚本无法继续往下走了,google了一下,好像说,需要另外的tty才行,所以改成

ssh user@host "~/restart.sh < /dev/null > /dev/null 2>&1 &"

注意nohup和重定向的设置后,这个重启的任务便可以在后台执行,而且执行完之后,可以断开这个ssh连接,但是问题又来了,这个重启在后台执行,让我无法知道他什么时候重启完成了,我接下来做的事情是要依赖他重启完成且成功的。大家说说该怎么改一下。对ssh的一些选项也不怎么熟现在
3564 次点击
所在节点    问与答
9 条回复
okidogi
2013-01-04 23:02:29 +08:00
看了两遍没看明白。。。不过如果你的需求是断开ssh连接服务器端仍然在执行并且最后再次连接可以看到运行结果的话,screen是你的不二选择。
Kymair
2013-01-04 23:08:25 +08:00
我也没看懂 楼主你是想要blocking还是non-blocking的?
atom
2013-01-05 00:41:39 +08:00
楼主其实就是要自己搞一套发布部署脚本,有基本的协调控制。

在执行完ssh user@host "~/restart.sh < /dev/null > /dev/null 2>&1 &"
加上轮询逻辑,每隔几秒检查一下目标机的状态。
无外乎两种套路。
1.你的服务特征明显,ps看下进程名
2.你的服务特征不明显,那么可以在服务启动成功时,写入pid+时间戳或别的什么东西,到某个临时文件。转而检查这个临时文件的内容是否符合启动特征。
pythonee
2013-01-05 09:05:48 +08:00
@atom

没有错,确实是这样,非要论询吗,其实我就是不想轮询才想问的
pythonee
2013-01-05 09:06:28 +08:00
@okidogi
@Kymair

抱歉,表达不到位,大家可以参考一下3楼吧
atom
2013-01-05 12:55:43 +08:00
@pythonee 轮询复杂度最低,脚本的本质是quick and dirty,感觉比较难做到你理想中的情况。期待楼下有更好的方案。
ratazzi
2013-01-05 13:09:40 +08:00
用 fabric 吧,需要些 python 基础
pythonee
2013-01-05 13:17:06 +08:00
@atom

目前暂时用轮询实现了,谢谢
Mattsive
2013-01-05 18:24:03 +08:00
fabric 两行代码的事

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/56590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX