我需要开发一个shell脚本,如果它们的另一个实例正在运行,则不会启动。
如果我构建一个监视自己的test.sh,我需要知道它是否已经在运行,然后中止,否则(如果它之前没有运行)我可以运行
#!/bin/bash
loop() {
while [ 1 ]; do
echo "run";
#-- (... omissis ...)
sleep 30
done
}
daemon="`/bin/basename $0`"
pidlist=`/usr/bin/pgrep $daemon | grep -v $$`
echo "1:[ $pidlist ]"
pidlist=$(/usr/bin/pgrep $daemon | grep -v $$)
echo "2:[ $pidlist ]"
echo "3:[ `/usr/bin/pgrep $daemon | grep -v $$` ]"
echo "4:["
/usr/bin/pgrep $daemon | grep -v $$
echo "]"
if [ -z "$pidlist" ]; then
loop &
else
echo "Process $daemon is already running with pid [ $pidlist ]"
fi
exit 0;
当我第一次运行上面的脚本时(没有运行之前的实例),我得到这样的输出:
1:[ 20341 ]
2:[ 20344 ]
3:[ 20347 ]
4:[
]
我不明白为什么只有第4次尝试没有返回任何东西(如预期的)。我的剧本出了什么问题?我是否必须在临时文件上重定向第4个命令的输出,然后查询该文件,以决定我是否可以运行(或不)循环函数?
谢谢任何帮助我的人!
子壳…前三个在子shell中运行,因此$$
已更改为子shell的PID。
尝试使用:
PID=$$
pidlist=`/usr/bin/pgrep $daemon | grep -v $PID`
echo "1:[ $pidlist ]"
等。因为$PID
的值是在运行子shell之前建立的,所以对于所有的命令它应该是相同的。
这个进程是否足够流行,以至于其他人想要在机器上运行相同的守护进程?也许您的机器上从来没有多个用户,但是请记住,其他人也可能想要运行该命令。