终止进程的优雅方式

Eri*_*ric 13 process kill search

在我的 bash 脚本使用 selenium 服务器完成后,脚本会像这样杀死它:

kill `ps -ef | grep selenium | awk '{ print $2 }'`
Run Code Online (Sandbox Code Playgroud)

虽然这有效并且它确实杀死了 selenium 脚本,但它也尝试grep selenium终止进程,因此当进程号返回到 kill 命令时,进程已经消失,因此最终生成错误消息。(换句话说:它最终杀死了两个进程,其中一个是真正的 selenium 服务器,另一个是一个短暂的进程,它是我执行此命令的方式的副作用。)

有没有更优雅的方式来终止进程,没有这种意外的副作用?

(FWIW 我有一个想法:这个相同的脚本在脚本的早期启动了 selenium,所以也许如果有一种方法可以在我启动 selenium 时捕获 PID,我可以保留它并直接杀死它,而不是 grepping for进程 ID。问题是,我不知道如何获取该 PID、如何使用变量来保留它以及如何在脚本中稍后引用它。但这是更好的方法吗?)

mil*_*013 20

尝试该pgrep命令,它将输出您感兴趣的命令的 PID。

pgrep selenium
Run Code Online (Sandbox Code Playgroud)

要实际终止进程,请使用配套pkill命令。

pkill selenium
Run Code Online (Sandbox Code Playgroud)

  • 使用`pkill`要简单得多。`pkill` 使用与 `pgrep` 完全相同的匹配标准,因此您可以在 1 个命令而不是 2 个命令中执行此操作(并且必须依赖于一个的输出)。 (7认同)
  • 如果你给 pgrep '-f' 标志,它将匹配整个命令行的模式。所以,在这种情况下 kill `pgrep -f selenium` 应该可以工作 (2认同)

Mom*_*omo 13

尝试使用,pkill selenium如果此方法或其他方法都不起作用,您可以继续将您的方法与另一个管道序列一起使用,例如

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`
Run Code Online (Sandbox Code Playgroud)


Bil*_*hor 7

尝试使用grep [s]elenium. 这样就找不到grep进程了。

  • @hesse - `grep` 默认使用 BRE。也就是说,`[` 和`]` 出现在`grep` 的`argv` 中,但它不匹配,因为`[` 和`]` 没有被`grep` 直接使用。 (2认同)