当我尝试在远程主机上结合另一个命令执行pkill时,它总是返回255,即使这两个命令都成功了。
ssh <remoteHost> 'pkill -f xyz' # returns 0 (rightly so when xyz is a process)
ssh <remoteHost> 'source /etc/profile' # returns 0 (rightly so)
但是当我运行组合命令时:
ssh <remoteHost> 'source /etc/profile; pkill -f xyz' # returns 255 - why?
关于&#34; pkill&#34;与另一个命令结合使用,因为即使它是一个组合,以下返回零:
ssh <remoteHost> 'source /etc/profile; ls' # returns 0
当我们尝试杀死它时,假设xyz
一直在运行。
我不明白这种行为。为什么在案例3中它返回255?
答案 0 :(得分:3)
The documentation for the pkill -f
选项说:
-f
该模式通常仅与进程名称匹配。设置-f时,使用完整的命令行。
所以pkill -f xyz
会使用&#34; xyz&#34;在命令行的任何地方。
当您运行ssh <remoteHost> 'source /etc/profile; pkill -f xyz'
时,远程ssh服务器将代表您运行相当于此的内容:
$SHELL -c 'source /etc/profile; pkill -f xyz'
生成的shell实例是一个使用&#34; xyz&#34;在其命令行中。我的猜测是pkill
正在杀死它,而ssh报告被杀死的会话为退出代码255,如下所示:
$ ssh localhost 'kill $$'
$ echo $?
255
当你运行ssh <remoteHost> 'pkill -f xyz'
时不会发生这种情况,因为像bash这样的shell会针对这种情况进行优化。 shell实例将使用pkill进程替换自身,而不是将pkill作为子进程运行。所以当pkill运行时,shell进程使用&#34; xyz&#34;在它的命令行上消失了。
你可以通过像这样运行pkill来解决这个问题:
ssh <remoteHost> 'source /etc/profile; exec pkill -f xyz'
如果这不起作用,您可以指定pkill模式,使其与模式本身不匹配。例如:
ssh <remoteHost> 'source /etc/profile; exec pkill -f "[x]yz"'
模式[x]yz
匹配文本&#34; xyz&#34;,所以pkill会杀死文本&#34; xyz&#34;出现。但这种模式并不匹配,因此pkill不会杀死模式出现的进程。