我正在尝试以编程方式终止作为后台进程运行的 bash 脚本(在 macOS 上)。我现在决定的方法是指定pgrep
脚本的名称,然后将 PID 值传递给kill
函数。
注意:如果有人对如何执行此操作有更好的建议,请随时提供。
我遇到的问题是,在 macOS 上,进程的名称不仅仅是脚本的名称,而且看起来是/bin/bash /Users/...../[scriptname]
.另外,我无法pgrep [scriptname]
获取 PID,我必须pgrep bash
获取,这通常会给我多个结果。
有没有人对以下方面有建议:i)我如何pgrep
正确使用kill
此脚本或ii)是否有更明显/更干净的方法来执行此操作?
注意:当我在 Lubuntu 中运行相同的脚本时,它没有/bin/bash
完整目录作为名称的一部分,而只是称为[scriptname]
.所以pgrep [scriptname]
按预期工作。
答案1
是的 - macOS 在这方面非常混乱,但我认为pgrep
和pkill
是解决这个问题的好方法:
% pgrep -U 502 -f sleepforever.sh
43894
可能需要一些解释:
-U 502
是我的真实用户ID得到自id
sleepforever.sh
是我创建的一个脚本来测试这个:#!/bin/bash while : do sleep 10 done
但pgrep
实际上能做的就是找到pid
.要完成工作,请使用pkill
- 它与以下参数共享许多参数pgrep
:
% pkill -U 502 -f sleepforever.sh
%