pkill通过远程ssh返回255与另一个命令的组合

时间:2016-11-07 19:30:20

标签: linux ssh pkill

当我尝试在远程主机上结合另一个命令执行pkill时,它总是返回255,即使这两个命令都成功了。

实施例

  1. ssh <remoteHost> 'pkill -f xyz' # returns 0 (rightly so when xyz is a process)
    
  2. ssh <remoteHost> 'source /etc/profile' # returns 0 (rightly so)
    
  3. 但是当我运行组合命令时:

    1. ssh <remoteHost> 'source /etc/profile; pkill -f xyz' # returns 255 - why?
      
    2. 关于&#34; pkill&#34;与另一个命令结合使用,因为即使它是一个组合,以下返回零:

      1. ssh <remoteHost> 'source /etc/profile; ls' # returns 0
        
      2. 当我们尝试杀死它时,假设xyz一直在运行。

        我不明白这种行为。为什么在案例3中它返回255?

1 个答案:

答案 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不会杀死模式出现的进程。