我拼凑了一个命令来返回正在运行的守护进程的进程 ID:
ps aux | grep daemon_name | awk "{ print \$2 }"
它运行完美并返回 PID,但它还返回第二个 PID,这大概是我现在正在运行的进程。有没有办法将我的命令从返回的 PID 列表中排除?
我已经测试了几次,看来我的命令始终是列表中的第二个 PID,但我不想只抓取第一个 PID,以防它不准确。
答案1
grep 的-v
switch 反转结果,将其从队列中排除。因此,可以这样写:
ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"
更新。您还可以使用-C
switch 来指定命令名称,如下所示:
ps -C daemon_name -o pid=
后者-o
决定了您想要在列表中显示哪些列的信息。仅列出进程 ID 列。后面的pid
等号表示该列没有列标题,因此您只能获得清晰的数字 - PID。=
pid
希望这可以帮助。
答案2
您可以使用字符类技巧。“[d]”与“[d]”不匹配,仅与“d”匹配。
ps aux | grep [d]aemon_name | awk "{ print \$2 }"
我更喜欢使用这个| grep -v grep
。
答案3
ps
如果有更可靠的替代方案,则避免解析的输出。
pgrep daemon_name
pidof daemon_name
答案4
用于pgrep
通过名称查找进程的 pid:
pgrep proc_name
结果中包含额外的进程名称(-l
):
pgrep -l proc_name
查找并显示进程名称(-l
)和参数(-f
):
pgrep -lf proc_name_or_argument
的好处pgrep
是它永远不会将自己报告为匹配项。但您不需要通过获取 pidpgrep
然后通过 终止相应的进程kill
。pkill
而是使用:
pkill proc_name
指定SIGKILL
信号(-9
或-KILL
)而不是SIGTERM
(默认):
pkill -9 proc_name
查找进程名称 ( -l
) 和参数 ( ),然后在通过信号 (或)终止进程之前-f
请求确认 ( ) :-I
SIGKILL
-9
-KILL
pkill -KILL -Ilf proc_name_or_argument
请注意,该-I
选项仅在某些版本中可用pkill
,例如OS X Mavericks 上的版本。