我正在尝试在 bash 脚本中检查某个进程是否正在运行。此功能是脚本的一部分。因此,在这个 bash 脚本中,我已启用此功能-e
,但现在此功能因服务尚未运行而失败,因为否则 PID 的值为空。
我希望此函数在 if 条件 pid 不存在时退出且不出现错误,并且脚本的其余部分将继续运行,但它中断了。我可以不使用 来运行它set -e
,但是有没有办法使用 来运行它set -e
#!/bin/bash
set -e
stop_service () {
pid=`ps -ef | grep -v grep | grep process.jar | awk '{print $2}'`
if [ ! -d "/proc/$pid" ]; then
echo "already not running" #exit the loop
else
echo "killing $pid"
kill $pid
fi
}
stop_service
答案1
如果你希望脚本出口,请使用exit
命令。如果您希望该函数返回为了使脚本的其余部分可以继续,请return
按照我在这里所做的那样使用。
#!/bin/bash
set -e
stop_service () {
pid=$(ps -ef | awk '/[p]rocess.jar/ {print $2; exit}')
if [[ -n "$pid" && -d "/proc/$pid" ]]; then
echo "killing $pid" >&2
kill "$pid" || :
else
echo "process is not running" >&2
return 1
fi
}
stop_service
请注意,在原始代码中,如果pid
为空,则目录表达式"/proc/$pid"
将缩减为"/proc/"
,因此测试仍然会成功。我不完全确定您为什么要检查目录/proc/$pid
,因为根据定义,如果您在进程表中找到目录条目,它将存在于基于 Linux 的系统上;但是,我在修改后的代码中保留了该检查。
答案2
我建议您在终止它之前检查 $pid 是否已设置,这样您就不会收到错误。
您可以按如下方式检查变量是否为空(根据本网站):
if [ -z "$var" ]
then
echo "\$var is empty"
else
echo "\$var is NOT empty"
fi