脚本 shell 获取 id 并终止进程

脚本 shell 获取 id 并终止进程

请问,我无法在我的命令中找到错误。

ssh -t root@$machine -x "sshpass -p 'ubuntu' ssh -t root@$address -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/nul -x 'ps -ef | grep "myprocess" | awk {print $2} | xargs kill'"

我有这个错误:

awk: line 2: missing } near end of file

你有主意吗?

答案1

对于这类问题,通常最好从将其分解成其组成部分。从最内层的表达式开始,其目的似乎是为了获取所有 PIDmyprocess以便向它们发出信号,然后向外进行,沿途测试每个步骤以确保它提供您期望的输出。

您可以通过获取 的输出ps、grepping 查找进程、运行输出awk以提取相关 PID,然后将其传递给 xargs 来执行此操作。通过查看您实际努力实现而不是你面临的具体问题,我可以告诉你至少有两种更好的方法可以做到这一点,这也恰好完全避免了您所面临的问题(基于在单个复合命令中存在多层引用)。


一种方法是保留ps并使用其-C-o参数来仅获取您感兴趣的信息。这实际上是在 ps(1) 手册页中作为示例提到的。然后您需要:

ps -C myprocess -o pid=

这将仅打印具有图像名称的任何进程的 PID myprocess。然后可以简单地将其输入到 xargs 中,将您的替换ps ... | xargs kill为:

ps -C myprocess -o pid= | xargs kill

或者可能使用进程替换来完全避免管道和 xargs:

kill $( ps -C myprocess -o pid= )

甚至更好的选择是用来killall直接向所有具有给定图像名称的进程发出信号:

killall -e myprocess

这里-e指定“精确”模式,其中进程映像名称必须完全匹配。在这种情况下,请用ps ... | xargs kill上面的内容替换您的全部内容。


-o UserKnownHostsFile=/dev/nul

哦,常规名称是 /dev/null,而不是 /dev/nul。NUL这是 20 世纪 70 年代中期的 CP/M 主义,由 Microsoft 延续到当前版本的 Windows 中。在这种特殊情况下,效果可能相同也可能不同,具体取决于您的严格程度ssh

相关内容