如何使用ssh在后台运行命令并分离会话

Pro*_*mer 20 ssh shell nohup

我正在尝试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;'
Run Code Online (Sandbox Code Playgroud)

Jay*_*yan 24

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

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

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

我会使用以下命令:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'
Run Code Online (Sandbox Code Playgroud)

@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 &'
Run Code Online (Sandbox Code Playgroud)

希望这工作;-)

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

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


Joh*_*nck 21

您对此使用有何看法screen?您可以screen通过ssh 运行来启动命令(concat.sh),然后如果您想监视它,您将能够返回到屏幕会话(可能很方便,取决于concat的功能).

更具体地说,试试这个:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh
Run Code Online (Sandbox Code Playgroud)

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

  • ssh -t做一个TTY.屏幕需要这个.
  • screen -dm使它以"分离"模式启动.这就像你的目的"背景".
  • -S测试为您的屏幕会话命名.它是可选的,但建议使用.

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

screen -r testing
Run Code Online (Sandbox Code Playgroud)

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

  • @richardkmiller:刚才我尝试的时候,你得到了同样的(坏)结果.我将`-t`选项更改为ssh而不是`-f`,以便它为命令提供背景(并且不分配TTY),然后它起作用.自从我写这个答案以来,我怀疑在2年多的Linux中发生了一些变化...尝试`ssh -f HOST"screen -dm -S sleep sleep 10"`你可能会发现它现在有效. (4认同)
  • @John Zwinck,这对你有用吗?以下命令对我不起作用:ssh -t HOST"screen -dm -S sleep sleep 10".它简单地说"连接到HOST关闭",当我登录到服务器时,没有分离的屏幕. (2认同)