我想创建一个bash脚本来检查foo是否已经在运行,如果不是则运行它。
以下是代码:
#!/usr/bin/env bash
function run {
if ! pgrep $1;
then
$@
fi
}
run foo
执行脚本后,尽管foo已经在运行,但它启动了另一个foo实例。
pgrep foo返回进程号,所以我可以让脚本先杀死它然后再次启动foo,但我想知道是否可以按照上面的描述完成。 我在这里缺少什么?
答案 0 :(得分:2)
一些改进:
function run {
if ! pgrep -x "$1" >/dev/null
then
"$@"
fi
}
run foo bar "baz qux"
注释:
-x
pgrep选项限制搜索名为“foo”的进程,而不是包含“foo”的进程您可以将此缩短为
run() { ! pgrep -x "$1" >/dev/null && "$@"; }
我们可以编写pgrep -x "$1" >/dev/null || "$@"
但如果进程已经运行,那将返回成功的退出状态,并且如果无法启动进程,我认为返回失败状态会更有意义。