Bash 检查是否 运行 的脚本
Bash script to check if running
我的 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 中,每次脚本为 运行 时,它都会检查如果是运行宁。如果脚本是运行ning,它什么都不做;如果不是 运行ning,它应该继续并启动 rsync。
有人知道我该怎么做吗?
正如 swornabsent 在评论中指出的那样,您可以改用 file-based locks, though that SO link identifies some good reasons not to use it. See this SO question about quick-and-dirty locking in shell scripts, which has a great answer about advantages to directory-based locks。
要识别进程是否为 运行,您也可以选择使用 pgrep
,但在一般情况下这可能不是一个好主意,因为检查之前和之后的时间进程启动。
您可以将脚本的 PID 写入文件 echo $$ > /var/run/rsync_job.pid
然后当你开始的时候你可以先检查那个文件是否存在,如果它确实从它读取 PID,看看那个进程是否仍然存在,比如
if ps -p $PID &>/dev/null; then
# it's still running
exit
fi
我的 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 中,每次脚本为 运行 时,它都会检查如果是运行宁。如果脚本是运行ning,它什么都不做;如果不是 运行ning,它应该继续并启动 rsync。
有人知道我该怎么做吗?
正如 swornabsent 在评论中指出的那样,您可以改用 file-based locks, though that SO link identifies some good reasons not to use it. See this SO question about quick-and-dirty locking in shell scripts, which has a great answer about advantages to directory-based locks。
要识别进程是否为 运行,您也可以选择使用 pgrep
,但在一般情况下这可能不是一个好主意,因为检查之前和之后的时间进程启动。
您可以将脚本的 PID 写入文件 echo $$ > /var/run/rsync_job.pid
然后当你开始的时候你可以先检查那个文件是否存在,如果它确实从它读取 PID,看看那个进程是否仍然存在,比如
if ps -p $PID &>/dev/null; then
# it's still running
exit
fi