2014-04-09 142 views
3

具有低于示例脚本sample.sh如何从脚本本身检查脚本是否正在运行?

#!/bin/bash 

if ps aux | grep -o "sample.sh" >/dev/null 
then 
    echo "Already script running" 
    exit 0 
fi 

echo "start script" 

while true 
do 
    echo "script running" 
    sleep 5 
done 

在上面的脚本中,我要检查,如果该脚本之前运行或不运行,如果没有,然后再运行它。

问题是检查条件总是成真(因为检查条件需要运行脚本),它总是显示我"Already script running"消息。

任何想法如何解决它?

回答

7

您需要一个正确的锁。我愿意做用flock这样的:

exec 201> /tmp/lock.$(basename $0).file 
if ! flock -n 201 ; then 
    echo "another instance of $0 is running"; 
    exit 1 
fi 

# cmds 

exec 201>&- 
rm -rf /tmp/lock.$(basename $0).file 

这基本上创建了使用临​​时文件脚本锁。临时文件除了用于告诉您的脚本是否获得锁定之外,具有特别的意义。 当运行此程序的一个实例时,同一程序的下一次运行无法运行,因为锁会阻止它。

+0

我相信锁定文件不应该被删除。无需删除它,如果删除它,则存在在被锁定时删除它的风险,这会中断该锁(因为锁仍然存在,但文件将会更改)。 –

+0

在程序中删除它是无害的,因为一旦程序退出,锁将自动释放。我倾向于删除我创建的临时工。 –

+0

但它显示错误像'./sample.sh:第3行:/tmp/lock../sample.sh.file:没有这样的文件或目录 flock:201:错误的文件描述符' –

0

试试这个,它给用户

ps -aux | awk -v app='sample.sh' '$0 ~ app { print $1 }' |grep $USERNAME|wc -l 
1

运行对我来说将是更安全的使用锁文件,创建它的过程开始和完成后删除sample.sh的数量。

1

让脚本在文件中记录自己的PID。在这之前,它首先检查该文件当前是否包含活动的PID,在这种情况下它将退出。

pid=$(< ${PID_FILE:?} || exit 
kill -0 $PID && exit 

下一个练习是为了防止竞争条件时写作文件。

0

将tmp文件写入/ tmp目录。 有你的脚本检查,看看文件是否存在,如果它确实没有运行。

#!/bin/sh 

# our tmpfile 
tmpfile="/tmp/mytmpfile" 

# check to see if it exists. 
# if it does then exit script 
if [[ -f ${tmpfile} ]]; then 
echo script already running. 
exit 
fi 

# it doesn't exist at this point so lets make one 
touch ${tmpfile} 

# do whatever now. 

# end of script 
rm ${tmpfile} 
+0

如果我的剧本意外死亡会怎么样?所以它不会去除tempfile。 –

+0

您可以在文件名中包含PID名称,也可以将其写入临时文件中。在进程崩溃的情况下,新进程将具有不同的PID。 – Vaibhav

相关问题