pkill returns 255 通过远程 ssh 与另一个命令结合使用
pkill returns 255 in combination with another command via remote ssh
当我尝试在远程主机上结合另一个命令执行 pkill 时,它总是 returns 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?
关于 "pkill" 与另一个命令的组合,因为以下 return 为零,即使它是组合:
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 不会终止出现该模式的进程。
当我尝试在远程主机上结合另一个命令执行 pkill 时,它总是 returns 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?
关于 "pkill" 与另一个命令的组合,因为以下 return 为零,即使它是组合:
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 不会终止出现该模式的进程。