2010-12-13 143 views
1

我在Unix中使用SSH运行远程计算机上的脚本时出现问题。该脚本意味着无限地运行,直到事件发生,在这种情况下,它将摆脱它的循环。不幸的是,在短暂的一段时间后,脚本停止运行。我相信这是与SSH相关的,因为脚本运行时本地运行正常。在Unix中的远程计算机上永久运行脚本

有没有一种方法可以触发我的远程机器运行该脚本,就好像它正在本地运行一样,以便我可以关闭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脚本包含的基本上是同时,将永远运行,直到坏了真正的语句做的。

任何帮助表示赞赏,谢谢。

+0

停止使用expect,并且直接将密码直接传递给ssh?或更好的,使用键。无论如何,这感觉更像是一个superuser.com/serverfault.com类型的问题。 – falstro 2010-12-13 18:23:43

回答

1

是的,你可以通过键入做到这一点使用screen

  • 登录到远程机器
  • 开始一个新的屏幕会话:screen
  • 然后运行脚本正常:./myscript
  • 然后,要分离:Ctrl-A, D

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

1

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

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

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

  1. 在客户端上运行ssh-keygen。您可以在所有提示处按Enter键以使用空白密码。
  2. ~/.ssh/id_rsa.pub的内容添加到服务器上名为authorized_keys的文件末尾:[email protected]:~/.ssh/authorized_keys

创建一个密钥,然后将其添加到authorized_keys,允许客户端连接到服务器而无需使用密码,它可以让您在不将密码编码成纯文本脚本的情况下进行连接。

+0

我认为这个答案是(+1)。一些评论,(1)我通常使用>&将所有输出重定向到一个文件。如果你不这样,那么nohup将它写入某个默认文件。如果你有两个或多个以这种方式运行的进程,这会让你感到困惑。 (2)我使用expect,一个tcl软件包,当我不能使用预授权密钥时,在ssh中输入密码。这很少见,但值得了解它的工作原理。 – 2011-03-08 17:50:35

0

使你的脚本运行下去,你需要做两件事情

  1. 确保你不写到终端。关闭它或重定向stdout和stderr,然后关闭stdin。如果你不这样做,他们会保持SSH打开,并且/或者导致你的脚本在一个破损的管道上终止。
  2. 您需要在终端断开连接时捕获发送到您的进程的SIGHUP,并且通常会导致脚本终止。

这在不同的语言中有不同的表现,因此对于您选择的语言,您需要查看它。在bash中,您使用exec >logfile 2>&1将stdout和stderr重定向到日志文件,并使用trap "" HUP来忽略HUP信号。如果可以的话,还要启动一个新的进程组,以将父pid重置为init(正式使其成为守护进程)。

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

0

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

这里有一个不错的HOWTO

如果你的脚本是用Perl或Python编写的一些流行语言,你将能够找到模块来完成它。

相关问题