20

我目前正在尝试 ssh 进入远程机器并运行脚本,然后让节点运行脚本。下面是我的脚本。但是,当它运行时,脚本在机器上成功运行,但 ssh 会话挂起。有什么问题?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
4

5 回答 5

25

在某些情况下,您想在远程机器/服务器(将自动终止)上执行/启动某些脚本并断开与服务器的连接。

例如:在盒子上运行的脚本,执行时

  1. 获取模型并将其复制到远程服务器
  2. 创建用于使用模型运行模拟的脚本并将其推送到服务器
  3. 在服务器上启动脚本并断开连接
  4. 因此启动的脚本的职责是在服务器中运行模拟,并在完成后(需要几天才能完成)将结果复制回客户端。

我会使用以下命令:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

@CKeven,您可以将所有这些命令放在一个脚本上,将其推送到远程服务器并按如下方式启动它:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

希望这有效;-)

编辑:您也可以使用 ssh user@host 'screen -S SessionName -d -m "/path/to/executable"'

它创建一个分离的屏幕会话并在其中运行目标命令

于 2010-02-17T13:14:45.207 回答
21

你觉得用screen这个怎么样?您可以通过 ssh 运行来screen启动命令(concat.sh

更具体地说,试试这个:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

您应该会发现提示立即返回,并且concat.sh正在远程计算机上运行。我将解释一些选项:

  • ssh -t制作 TTY。屏幕需要这个。
  • screen -dm使其以“分离”模式启动。对于您的目的,这就像“背景”。
  • -Stesting 为您的屏幕会话命名。它是可选的,但建议使用。

现在,完成此操作后,您可以转到远程计算机并运行以下命令:

screen -r testing

这会将您附加到包含您的程序的屏幕会话。从那里你可以控制它、杀死它、查看它的输出等等。Ctrl-A,然后 d 将使您与屏幕会话分离。 screen -ls将列出所有正在运行的会话。

于 2009-10-27T01:00:52.260 回答
4

它可能是标准输入流。尝试ssh -n ...ssh -f ...

于 2009-10-27T01:00:29.603 回答
0

对我来说,只有这个有效:

screen -dmS name sh my-script.sh

当然,这取决于屏幕,如果您需要标准输入或标准输出,您可以稍后附加。当 my-script.sh 结束时,屏幕将自行终止。

于 2013-12-02T14:45:02.130 回答
0

下面是一个更常见的决定,需要一些努力才能找到,它确实对我有用:

#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"

echo "this is a test"

ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

它将命令的 $theStuff 列表发送到选项卡 No $theTabNumber 的屏幕会话 $theScreenSessionName 代表“用户”在“服务器”上初步创建。

请注意 -X stuff \" 之后的尾随空格,用于克服“stuff”选项的故障。下一行中的空格和 $theStuff 由“Enter”(^M)击键附加。不要错过'EM!

“这是一个测试”消息在初始终端中回显,并且 $theStuff 命令确实在提到的屏幕/选项卡内执行。

于 2014-10-10T09:42:23.257 回答