Bash pgrep regexp函数

时间:2018-06-04 21:32:29

标签: regex bash grep

我想创建一个bash脚本来检查foo是否已经在运行,如果不是则运行它。

以下是代码:

#!/usr/bin/env bash

function run {
 if ! pgrep $1;
 then
  $@
 fi
}
run foo

执行脚本后,尽管foo已经在运行,但它启动了另一个foo实例。

pgrep foo返回进程号,所以我可以让脚本先杀死它然后再次启动foo,但我想知道是否可以按照上面的描述完成。 我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

一些改进:

function run {
    if ! pgrep -x "$1" >/dev/null
    then
        "$@"
    fi
}
run foo bar "baz qux"

注释:

  1. 引用所有您的变量。这将保留包含空格的任何单词。
  2. 重定向pgrep
  3. 的输出
  4. 使用-x pgrep选项限制搜索名为“foo”的进程,而不是包含“foo”的进程
  5. 您可以将此缩短为

    run() { ! pgrep -x "$1" >/dev/null && "$@"; }
    

    我们可以编写pgrep -x "$1" >/dev/null || "$@"但如果进程已经运行,那将返回成功的退出状态,并且如果无法启动进程,我认为返回失败状态会更有意义。