我目前正试图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;'
还有,当你想执行/启动远程计算机/服务器上的某些脚本(这将自动终止),并从服务器断开连接的一些情况。
例如:在机器上运行一个脚本,执行时
- 采用模型并将其复制到远程服务器
- 对于与模型运行仿真创建一个脚本,并将其推送到服务器
- 启动脚本的服务器和断开的
- 从而开始了剧本的职责是在运行服务器仿真和一旦完成(需要数天才能完成)的结果复制回客户端。
我会用下面的命令:
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用户@主机“界面-S SESSIONNAME -d -m‘/路径/到/可执行文件’”
这将创建一个分离屏幕会话并在其运行目标命令
你认为使用哪种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
这当然取决于屏幕,并让您稍后再连接,如果你想标准输入和标准输出。 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
\""
它发出代表“用户”的标签在“服务器”初步建立的屏幕会话$ theScreenSessionName没有$ theTabNumber命令$ theStuff名单。
请注意后-X东西\”发送到克服‘东西’选项的毛刺尾随空白的。在接下来的行中的空白和$ theStuff被‘确认’追加(^ M)键。千万不要错过“EM!
的“这是一个测试”消息中的初始终端是呼应,和$ theStuff命令在屏幕提到/选项卡内确实执行。