gpt4 book ai didi

linux - 从 bash 脚本终止 ssh 或\和远程进程

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:11 25 4
gpt4 key购买 nike

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

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

不幸的是,它似乎正在做的是远程启动程序:nodes-listener,但它永远不会再进一步​​,并且不会将控制权交给 bash 脚本。因此,停止执行的唯一方法是执行 Ctrl+C。

杀死 ssh 没有帮助(或者更确切地说无法执行),因为控制不是使用 bash 脚本,因为它等待 ssh session 中的命令完成,这当然永远不会发生,因为必须杀死它才能停止。

最佳答案

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

/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。

关于linux - 从 bash 脚本终止 ssh 或\和远程进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25608370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com