从bash脚本中杀死ssh或\和远程进程

时间:2014-09-01 14:48:20

标签: linux bash ssh

我正在尝试运行以下命令作为bash脚本的一部分,该脚本假设打开ssh通道,在远程计算机上运行程序,将输出保存到文件10秒,终止进程,这是写入该文件,然后将控件返回到bash脚本。

#!/bin/bash
ssh hostname '/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null; sshpid=!$; sleep 10; kill -9 $sshpid 2>/dev/null &'

不幸的是,它似乎正在做的是启动程序:远程节点监听器,但它永远不会得到任何进一步的,它不会控制bash脚本。因此,停止执行的唯一方法是执行Ctrl + C.

杀戮ssh没有帮助(或者更确切地说无法执行),因为控件不是使用bash脚本,因为它等待ssh会话中的命令完成,这当然不会发生,因为它不得不被杀死。

3 个答案:

答案 0 :(得分:0)

您需要在第一个命令后放置&符号,然后将剩余的命令放到下一行:

ssh hostname -- '/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null &
sshpid=$!; sleep 10; kill $sshpid 2>/dev/null'

顺便说一句,ssh在执行完所有命令后返回。这意味着它也将关闭已分配的pty。如果在该shell会话中仍有后台作业正在运行,那么它们将被SIGHUP 杀死。这意味着,您可以省略显式kill命令。 (取决于nodes-listener是否以不同方式处理SIGHUP和SIGTERM)。有了这个,您可以将代码简化为以下内容:

ssh hostname -- sh -c '/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null &
sleep 10'

答案 1 :(得分:0)

这是您在远程系统上运行的命令行:

/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null
sshpid=!$
sleep 10
kill -9 $sshpid 2>/dev/null &

您应该将其更改为:

/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null & <-- Ampersand goes here
sshpid=$!
sleep 10
kill -9 $sshpid 2>/dev/null

您想要启动nodes-listener,然后在十秒后将其杀死。为此,您需要启动nodes-listener作为后台进程,以便执行此命令行的shell在启动nodes-listener后继续执行下一个命令。命令行中的&位于错误的位置,并且仅适用于kill命令。您需要将它应用于nodes-listener命令。

我还会注意到您的sshpid=!$行不正确。你想要sshpid=$!$!是在后台启动的最后一个命令的进程ID。

答案 2 :(得分:0)

我已经通过将shell脚本推送到远程计算机并在那里执行来解决了这个问题。它实际上不那么整洁,依赖于远程计算机上可用的空间。

由于我的远程计算机是一个小型物理设备,因此空间使用问题很重要(即使在这种情况下需要的空间很小)。

/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null &
sshpid=!$
sleep 20
sync
# killing nodes-listener process and giving control back to the base bash
killall -9 nodes-listener 2>/dev/null && echo "nodes-listener is killed"