在Unix中永久运行远程机器上的脚本

时间:2010-12-13 18:21:07

标签: unix ssh

我在Unix中使用SSH在远程计算机上运行脚本时遇到问题。该脚本旨在无限运行,直到事件发生,在这种情况下,它将突破其循环。不幸的是,经过一小段时间后,脚本停止运行。我认为这与SSH作为脚本运行localy按预期工作有关。

有没有办法可以触发我的远程计算机来运行该脚本,就好像它是在本地运行一样,这样我就可以关闭SSH连接并且它仍然会运行?

调用位于远程计算机上的脚本的脚本是:。

 #!/usr/bin/expect set add [lindex $argv 0] set add2 [lindex $argv 1]
spawn ssh -l root2 ${add} /home/jason/localCopy/selfMonitor &
expect *assword: send "BIGMASSIVESECRET\r"
expect "]$ "

selfMonitor脚本中包含的内容基本上是一个do while true语句,它将一直运行直到损坏。

感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分:1)

是的,您可以使用screen

执行此操作
  • 登录远程计算机
  • 输入:screen
  • 开始新的屏幕会话
  • 然后照常运行您的脚本:./myscript
  • 然后,分离:Ctrl-A, D

要稍后重新挂接,请登录计算机,然后运行screen -r以重新连接到正在运行的会话。

答案 1 :(得分:1)

使用nohup让您的脚本忽略SIGHUP,当父shell退出时,SIGHUP将发送到后台进程。

spawn ssh -l root2 ${add} nohup /home/jason/localCopy/selfMonitor &

此外,ssh故意使编写密码条目变得困难,并鼓励您不要解决此问题。允许无密码ssh访问的正确方法是使用预授权密钥。

  1. 在客户端上运行ssh-keygen。您可以在所有提示中按Enter键以使用空白密码。
  2. ~/.ssh/id_rsa.pub的内容添加到服务器上名为authorized_keys的文件的末尾:root2@server:~/.ssh/authorized_keys
  3. 创建密钥然后将其添加到authorized_keys允许客户端在不使用密码的情况下连接到服务器,并且无需将密码硬编码到纯文本脚本中即可完成。

答案 2 :(得分:0)

要让您的脚本永远运行,您需要做两件事

  1. 确保您没有写信给终端。关闭它或重定向stdout和stderr,然后关闭stdin。如果不这样做,他们将保持SSH打开,和/或导致脚本在损坏的管道上终止。
  2. 当终端断开连接时,您需要捕获发送到您的进程的SIGHUP,并且通常会导致脚本终止。
  3. 这在不同的语言中有所不同,因此对于您选择的语言,您需要查找它。在bash中,您使用exec >logfile 2>&1将stdout和stderr重定向到logfile,并使用trap "" HUP忽略HUP信号。如果可以,也可以启动一个新的进程组,将父pid重置为init(正式使其成为守护进程)。

    如果您需要从脚本访问终端输出(并且由于某种原因无法重定向),我是否可以推荐屏幕。

答案 3 :(得分:0)

另一种方法是妖魔化脚本,使其与连接到SSH的IO流分离,并在启动时启动新会话。

这里有一个很好的HOWTO

如果您的脚本是用Perl或Python等流行语言编写的,那么您将能够找到模块来执行此操作。

答案 4 :(得分:0)

尽管此处的解决方案有效,但我已经开始将tmux广泛用于此类任务。

您将可以随时开始会话,分离并重新连接。您可以断开与远程计算机的连接,它仍将运行。会话甚至可以具有多个窗口,等等。

如果您有10分钟的时间,请尝试以下简单指南:tmuxA Quick and Easy Guide to tmux

在阅读了指南之后,我写了一个小巧的小抄本,放在我面前一两天,但现在对我来说几乎是第二天性。我一直在使用tmux来完成其他任务,例如在一个窗格中运行后端服务器,在另一个窗格中运行前端服务器,而在另一个窗格中仅用于常规终端业务。完成某个项目的工作后,您可以分离并附加到另一个会话以继续上次中断的地方。