我正在尝试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;'
答案 0 :(得分:24)
在某些情况下,您希望在远程计算机/服务器上执行/启动某些脚本(将自动终止)并断开与服务器的连接。
例如:在执行时在框上运行的脚本
我会使用以下命令:
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”'
创建一个分离的屏幕会话并在其中运行目标命令
答案 1 :(得分:21)
您对此使用screen
有什么看法?您可以通过ssh运行screen
来启动命令(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
将列出所有正在运行的会话。
答案 2 :(得分:4)
它可以是标准输入流。试试ssh -n ...
或ssh -f ...
。
答案 3 :(得分:0)
对我来说,只有这个有效:
screen -dmS name sh my-script.sh
当然,这取决于屏幕,如果你想要stdin或stdout,可以让你以后附加。当my-script.sh结束时,屏幕将自动终止。
答案 4 :(得分: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命令列表发送到代表'user'在'服务器'初步创建的屏幕会话$ theScreenSessionName的选项卡No $ theTabNumber。
请注意以后的空白空格 -X东西\“ 发送以克服“东西”选项的故障。下一行中的空格和$ theStuff附加'Enter'(^ M)键击。不要错过'EM!
“这是一个测试”消息在初始终端中回显,$ theStuff命令实际上是在所提到的屏幕/标签内执行的。