Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从bash脚本中终止ssh或\和远程进程_Linux_Bash_Ssh - Fatal编程技术网

Linux 从bash脚本中终止ssh或\和远程进程

Linux 从bash脚本中终止ssh或\和远程进程,linux,bash,ssh,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 &' #/bin/

我正在尝试作为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 &'
#/bin/bash
ssh主机名“/root/bin/nodesListener>/tmp/nodesListener.out/dev/null&”
不幸的是,它似乎在远程启动程序:nodes listener,但它再也无法继续,也无法控制bash脚本。因此,停止执行的唯一方法是执行Ctrl+C


终止ssh没有帮助(或者说无法执行),因为控件在等待ssh会话中的命令完成时没有使用bash脚本,当然这永远不会发生,因为它必须终止才能停止

您需要在第一个命令后放置符号AND,然后将其余命令放在下一行:

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

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

/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null
sshpid=!$
sleep 10
kill -9 $sshpid 2>/dev/null &
/root/bin/nodesListener>/tmp/nodesListener.out/dev/null&
您应该将其更改为:

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

/root/bin/nodesListener>/tmp/nodesListener.out我通过将shell脚本推送到远程机器并在那里执行,解决了这个问题。它实际上不太整洁,并且依赖于远程计算机上的可用空间

因为我的远程机器是一个小型物理设备,所以空间使用问题很重要(即使在这种情况下需要的空间很小)

/root/bin/nodesListener>/tmp/nodesListener.out/dev/null&&echo“节点侦听器被杀死”

谢谢。我的命令是bash脚本的一部分。为什么我需要显式地指定它是bash?您的命令可以远程运行,由ssh触发。正如我所说的,ssh不会启动shell并在其中执行命令。它只需使用
execve
(或friends)来执行命令。但是,您的命令不仅仅是一个shell脚本。这就是为什么您需要在shell中执行它,它抱怨道:“sh:bash:not found”如果我在远程计算机上没有安装--bash-cIf bash来运行它,请使用
sh-c…
它启动了程序执行(节点侦听器),但它从未将控制权交还给我的机器,因此我必须使用Ctrl+c在我的机器上的bash文件中杀死ssh。
/root/bin/nodes-listener > /tmp/nodesListener.out </dev/null & <-- Ampersand goes here
sshpid=$!
sleep 10
kill -9 $sshpid 2>/dev/null
/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"