pkill 的文档 -f
选项说:
-f
该模式通常仅与进程名称匹配。设置 -f 时,将使用完整命令行。
So pkill -f xyz
将杀死命令行中任何位置带有“xyz”的任何进程。
当你跑步时ssh <remoteHost> 'source /etc/profile; pkill -f xyz'
,远程 ssh 服务器将代表您运行与此等效的命令:
$SHELL -c 'source /etc/profile; pkill -f xyz'
生成的 shell 实例是一个命令行中带有“xyz”的进程。我的猜测是pkill
正在终止它,并且 ssh 将终止的会话报告为退出代码 255,如下所示:
$ ssh localhost 'kill $$'
$ echo $?
255
当你跑步时不会发生这种情况ssh <remoteHost> 'pkill -f xyz'
,因为像 bash 这样的一些 shell 会针对这种情况进行优化。 shell 实例不会将 pkill 作为子进程运行,而是将其自身替换为 pkill 进程。因此,当 pkill 运行时,命令行上带有“xyz”的 shell 进程已经消失。
您可以通过运行 pkill 来解决此问题,如下所示:
ssh <remoteHost> 'source /etc/profile; exec pkill -f xyz'
如果这不起作用,您可以指定 pkill 模式,使其与模式本身不匹配。例如:
ssh <remoteHost> 'source /etc/profile; exec pkill -f "[x]yz"'
图案[x]yz
匹配文本“xyz”,因此 pkill 将杀死出现文本“xyz”的进程。但该模式与自身不匹配,因此 pkill 不会终止出现该模式的进程。