我有一些自主脚本,通过ssh在远程机器上运行命令。 这些脚本依靠获取stdout,stderr和每个命令运行的返回代码。 我希望能够监视每个目标机器上脚本的进度,以便我能够看到是否有东西被挂起,如果有必要可能会进行干预。
我最初的想法是让脚本在屏幕会话中运行命令,以便人员监视可以简单地使用screen -x附加到会话。 但是,由于屏幕是一个交互式程序,所以从脚本中很难做到这一点。 我可以发送一个命令到屏幕会话与screen -S session -X stuff "command^M" ,但是我没有得到输出并返回代码,我需要回来。
我的第二个想法是把script /path/to/log到~/.bash_profile并将整个会话logging到文件中。 然后监控人员可以简单地拖拽日志文件。 但是,这并不能提供我正在寻找的交互性。
任何想法如何解决这个问题?
我使用PHP脚本来pipe理我的Minecraft服务器。 我使用服务器日志来得到我的答复。 这里是我用来列出谁在线的代码。 我使用tail来获得最后几行,并parsing它们以确保响应是在发送命令之后。
#!/usr/bin/php <?php function send_cmd( $command ) { exec('screen -S minecraft -X stuff "`printf "\\r' . $command . '\\r"`"'); } function who() { if (!is_running()) { echo 'Server is not running.' . CRLF; return 4; } // Get the current time and send the command $before = time() - 1; send_cmd('list'); // Wait for the server to provide a response while(time() < $before + 5) { sleep(0.25); $result = exec('tail ' . __DIR__ . '/server.log | grep "\[INFO\] Connected players"'); $stamp = strtotime(substr($result, 0, 19)); if ($before <= $stamp) break; unset($result); } if (isset($result)) { echo $result . CRLF; echo 'Server responded in ' . ($stamp - $before) . ' seconds.' . CRLF; return 0; } else { echo 'Server did not respond.' . CRLF; return 4; } }
很多人际互动..我build议:
在这种情况下,只有在出现问题时才会收到警报。 他们有机会通过网页界面审查日志信息,确认这些日志信息,以便团队中的其他人知道正在处理的事情,并根据问题的性质决定何时采取行动。
我想build议使用“nohup” – 这将输出到nohup.out的标准输出。 你可以通过nohup脚本来安全地登出脚本,并继续运行。 查看man nohup了解更多详情。
典型用法是#> nohup /usr/local/bin/myscript.sh&
它将在bg中运行脚本,而不要求您保持login状态。nohup.out将在运行时位于当前工作目录中,如果perms不允许,则将位于$ HOME / nohup.out中。 然后,您可以检查nohup.out的内容,找出需要解决的问题并相应处理。
现在,为了解决你的交互问题,你可以使用screen和nohup来运行这个脚本,这样,如果你的input被挂起,你可以把这个过程带回到前台。
希望这可以帮助
你应该看织物。 它只是你所描述的你正在寻找。 您将需要执行一些Python-ish脚本。 你将能够运行你的脚本。 从Fabric中执行命令可能会更有效。 你会明白我的意思; 运行教程。 http://docs.fabfile.org/0.9.2/
如果你想使用屏幕,你可以尝试这样的事情:
ssh user@address screen -d -m <command>
-d -m参数组合使屏幕开始新的会话,但不附加到它。
我使用这个命令的一个变种来运行在启动时不守护(像Minecraft)守护进程,它很好地工作。 稍后我可以连接到screen会话,并看到完整的输出和问题服务器命令,如正常。 以下是启动脚本变体,它以root用户身份运行屏幕会话(对于/etc/rc.local):
sudo -u <someuser> -i screen -d -m <command>