首页 > 解决方案 > 如何使用带斜杠的 pgrep?

问题描述

我想让以下 bash 代码工作:

#!/bin/bash

SERVICE="/usr/sbin/some_command"
if pgrep -x "$SERVICE" >/dev/null; then
  echo "$SERVICE is already running"
else
  $SERVICE some_arguments
fi

我认为斜线/会引起一些麻烦,但我仍然想保留它。

标签: bashprocessgrepps

解决方案


在 Linux 上,您需要使用-f来匹配整个命令行,因为没有它pgrep只会查看包含 no且最多 15 个字符的进程名称/

SERVICE="/usr/sbin/some_command"
if pgrep -f "$SERVICE" >/dev/null; then
  echo "$SERVICE is already running"
else
  $SERVICE some_arguments
fi

但是请注意,命令行可能根本不包含完整路径,因为可以执行文件$0,因此在这种情况下,您将无法获得所需的输出

来自man pgrep

  • -f,--full
    • 该模式通常仅与进程名称匹配。设置时-f,将使用完整的命令行。

...

笔记:

用于匹配的进程名称限于 /proc/pid/stat 的输出中存在的 15 个字符。使用-f选项来匹配完整的命令行,/proc/pid/cmdline.


推荐阅读