我在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语句,它将一直运行直到损坏。
感谢任何帮助,谢谢。
答案 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访问的正确方法是使用预授权密钥。
ssh-keygen
。您可以在所有提示中按Enter键以使用空白密码。~/.ssh/id_rsa.pub
的内容添加到服务器上名为authorized_keys的文件的末尾:root2@server:~/.ssh/authorized_keys
。创建密钥然后将其添加到authorized_keys允许客户端在不使用密码的情况下连接到服务器,并且无需将密码硬编码到纯文本脚本中即可完成。
答案 2 :(得分:0)
要让您的脚本永远运行,您需要做两件事
这在不同的语言中有所不同,因此对于您选择的语言,您需要查找它。在bash中,您使用exec >logfile 2>&1
将stdout和stderr重定向到logfile,并使用trap "" HUP
忽略HUP信号。如果可以,也可以启动一个新的进程组,将父pid重置为init(正式使其成为守护进程)。
如果您需要从脚本访问终端输出(并且由于某种原因无法重定向),我是否可以推荐屏幕。
答案 3 :(得分:0)
另一种方法是妖魔化脚本,使其与连接到SSH的IO流分离,并在启动时启动新会话。
这里有一个很好的HOWTO。
如果您的脚本是用Perl或Python等流行语言编写的,那么您将能够找到模块来执行此操作。
答案 4 :(得分:0)
尽管此处的解决方案有效,但我已经开始将tmux
广泛用于此类任务。
您将可以随时开始会话,分离并重新连接。您可以断开与远程计算机的连接,它仍将运行。会话甚至可以具有多个窗口,等等。
如果您有10分钟的时间,请尝试以下简单指南:tmux
:A Quick and Easy Guide to tmux
在阅读了指南之后,我写了一个小巧的小抄本,放在我面前一两天,但现在对我来说几乎是第二天性。我一直在使用tmux来完成其他任务,例如在一个窗格中运行后端服务器,在另一个窗格中运行前端服务器,而在另一个窗格中仅用于常规终端业务。完成某个项目的工作后,您可以分离并附加到另一个会话以继续上次中断的地方。