如何在远程服务器上启动进程,断开连接,然后再收集输出?

时间:2009-05-28 23:25:14

标签: python testing scripting

我在python中编写自动化代码来测试网络应用程序的行为。因此,我的代码需要能够在网络中的服务器上启动进程/脚本(例如,tcpdump或python脚本),断开连接,运行其他进程,然后返回并关闭/评估先前启动的进程。我的网络是windows和linux机器的混合,所有的机器都运行sshd和python(通过Cygwin用于windows机器)。

我考虑了几个想法,即: - 启动流程并通过尾随&符号将其移至后台(&) - 以某种方式使用屏幕 - 使用python线程

我还应该考虑什么?根据您的经验,您发现什么是完成此类任务的最佳方式?

8 个答案:

答案 0 :(得分:3)

nohup为初学者(至少在* nix框上) - 并将输出重定向到某个日志文件,您可以在那里回来监视它。

答案 1 :(得分:3)

所以现在我理解你真正想要的东西,我认为最好的解决方案是创建一个lite守护进程来运行你想要的任何进程。守护进程然后可以将输出转储到日志文件中,因此如果运行时间比您预期的要短,您仍然可以获得输出。这比摆弄屏幕更可靠。然而,应该指出,这可能存在安全风险。如果这是一项每N个时段运行的任务,那么cron会更好。

原始答案

GNU Screen是解决此问题的好方法。

编辑:重新阅读您的问题后,我想我误会了您。您是否希望在本地计算机上运行python脚本,该脚本将连接到远程计算机并运行一些任意进程,然后再次连接到远程计算机并检查日志或其他内容?

答案 2 :(得分:1)

对于快速轻量级的解决方案,您无法击败screen。如果您想完全自动化,那么将流程设置为作为守护程序运行并使用syslog写入系统日志是有意义的。您的系统可能有start-stop-daemon脚本,对于C代码,它也可能在C库中进行daemon(3)调用。

答案 3 :(得分:1)

如果您希望在离开后继续播放脚本,可以通过“nohup”(man nohup)调用它。你也可以把代码放在你调用的脚本中让它自己守护它...它分叉,使子进入一个守护进程,然后退出。出现了快速搜索:http://code.activestate.com/recipes/278731/

答案 4 :(得分:0)

正如@Gandalf提到的那样,除了背景和&之外,你还需要nohup,否则当登录会话终止时,进程将被SIGKILLed。如果您将输出重定向到日志文件,您将能够以后轻松查看它(而不必在所有计算机上安装屏幕)。

答案 5 :(得分:0)

大多数商业产品在远程计算机上安装“代理”。

在Linux世界中,你有很多这样的代理。 rexec和rlogin以及rsh都想到了。

这些是与远程主机上运行的后台进程通信的所有客户端。

如果你不想使用这些代理,你可以阅读它们并用纯Python重新发明这些轮子。本质上,客户端(例如rexec)与服务器(rexecd)通信以发送工作请求。

答案 6 :(得分:0)

而不是屏幕,因为它是针对单个进程的,我会建议它的轻量级兄弟dtach

有关在Python中隐藏进程的相当完整的配方,请参阅ActiveState cookbook中的Creating a daemon the Python way

答案 7 :(得分:0)

如果你使用python来运行自动化......我会尝试使用paramiko自动化所有内容。它是python的多功能ssh库。您可以实时收集多行输出,然后在不再需要该过程时断开连接,让ssh为您执行查杀,而不是返回输出。