Bash脚本检查是否正在运行

时间:2015-06-04 16:45:08

标签: bash debian rsync

我在crontab中有以下内容来同步我在服务器上的文件夹,因为它们是在每分钟同步的循环DNS设置上运行的。

* * * * * rsync -ar --delete -e ssh user@skynet.rizzler.se:/home/user/folder1/ /home/user/folder1/ >/dev/null 2>&1
* * * * * rsync -ar --delete -e ssh user@skynet.rizzler.se:/home/user/folder2/ /home/user/folder2/ >/dev/null 2>&1

这个Rsync适用于小文件,但它变得越来越大,所以我想知道如何将它放入脚本中,将该脚本放入我的crontab中,每次运行脚本时,它都会检查它是否& #39;正在运行。如果脚本正在运行,它将什么都不做;如果它没有运行,它应该继续并启动rsync。

任何人都知道我该怎么做?

2 个答案:

答案 0 :(得分:1)

在评论中注明 swornabsent ,您可以使用file-based locks,尽管该SO链接指出了不使用它的一些好理由。请参阅this SO question about quick-and-dirty locking in shell scripts,它对directory-based locks的优势有很好的答案。

要确定某个流程是否正在运行,您也可以选择使用pgrep,但由于检查后的时间和流程启动之前的某些情况,这可能不是一个好主意。< / p>

答案 1 :(得分:1)

您可以将脚本的PID写入echo $$ > /var/run/rsync_job.pid

的文件中

然后当你开始时,你可以首先检查该文件是否存在,以及它是否从中读取PID并查看该过程是否仍然存在,如

if ps -p $PID &>/dev/null; then
    # it's still running
    exit
fi