我目前正在尝试 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;'
有帮助吗?

解决方案

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

例如:在执行时在框上运行的脚本

  1. 获取模型并将其复制到远程服务器
  2. 创建一个脚本,用于使用模型运行模拟并将其推送到服务器
  3. 在服务器上启动脚本并断开连接
  4. 这样开始的脚本的职责是在服务器中运行模拟,一旦完成(需要几天才能完成),将结果复制回客户端。
  5. 我会使用以下命令:

    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&quot; / path / to / executable&quot;'

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

其他提示

您认为使用什么 screen 为了这?你可以跑 screen 通过 ssh 启动命令(concat.sh),然后如果您想监视它,您就可以返回到屏幕会话(可能很方便,具体取决于 concat 的作用)。

更具体地说,请尝试以下操作:

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

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

  • ssh -t 打 TTY。屏幕需要这个。
  • screen -dm 使其以“分离”模式启动。这就像您的目的的“背景”。
  • -S 测试为您的屏幕会话命名。它是可选的,但推荐使用。

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

screen -r testing

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

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

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

screen -dmS name sh my-script.sh

当然,这取决于屏幕,如果你想要stdin或stdout,可以让你以后附加。当my-script.sh结束时,屏幕将自动终止。

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

#!/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命令列表发送到代表'user'在'服务器'初步创建的屏幕会话$ theScreenSessionName的选项卡No $ theTabNumber。

请注意以后的空白空格 -X stuff \“ 发送以克服“东西”选项的故障。下一行中的空格和$ theStuff附加'Enter'(^ M)键击。不要错过'EM!

“这是一个测试”。消息在初始终端中回显,$ theStuff命令实际上是在所提到的屏幕/标签内执行的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top