pkill returns 255 通过远程 ssh 与另一个命令结合使用

pkill returns 255 in combination with another command via remote ssh

当我尝试在远程主机上结合另一个命令执行 pkill 时,它总是 returns 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)
    

但是当我运行组合命令时:

  1. ssh <remoteHost> 'source /etc/profile; pkill -f xyz' # returns 255 - why?
    

关于 "pkill" 与另一个命令的组合,因为以下 return 为零,即使它是组合:

  1. ssh <remoteHost> 'source /etc/profile; ls' # returns 0
    

假设 xyz 在我们试图杀死它时一直处于 运行ning 状态。

我不理解这种行为。为什么在案例 3 中 return 255?

The documentation for the pkill -f 选项表示:

-f
The pattern is normally only matched against the process name. When -f is set, the full command line is used.

因此 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' 时不会发生这种情况,因为一些 shell 像 bash 会针对这种情况进行优化。 运行ning pkill 作为子进程,shell 实例将用 pkill 进程替换自身。因此,到 pkill 运行s 时,命令行上带有 "xyz" 的 shell 进程已经消失。

您可能可以通过 运行ning 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 不会终止出现该模式的进程。