请问,我无法在我的命令中找到错误。
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
。