在linux的crontab里面,保证最多运行一个进程/两个进程/多个进程
这个多谢了老大的推荐。我解决了flock来解决crontab里面,即使系统卡住,也最多运行两个进程的问题。
flock 会去判断根据一个锁文件去判断进程有没有在运行。如果在运行,后面的进程就得等待。
flock -s --shared:
获得一个共享锁
flock -x --exclusive:
获得一个独占锁/排他锁
flock -u --unlock:
移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁。
flock -n --nonblock:
如果没有立即获得锁,直接失败而不是等待
flock -w --timeout:
如果没有立即获得锁,等待指定时间。
flock -o --close:
在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的控制。
flock -c --command:
在shell中运行一个单独的命令
根据业务需要,如果下一次crontab来了要执行的时候,判断文件是否是独占锁,如果锁定的话直接失败不等待。这样当下任务判断到/tmp/mytest.lock被锁定,则结束当前的任务,下一个周期再判断。参数为-xn.
因为这个是针对文件进行加锁的。文件是自己创建的。所以我们可以指定两个文件来实现。举个例子:
* * * * * sleep 30; flock -xn /home/onelock.lock -c 'cd /home/scrapy-web/v1/ && python run_spiders.py 1>>/data/log/collect/run_spiders.log 2>&1'
* * * * * flock -xn /home/twolock.lock -c 'cd /home/scrapy-web/v1/ && python run_spiders.py 1>>/data/log/collect/run_spiders.log 2>&1'
这里,我在/home的目录下创建了两个锁文件。一个是onelock.lock
, 一个是twolock.lock
.而且,第一个crontab,我在执行之后加了一个sleep 30;
s,保证两个脚本不会同时运行。 这样的话,在运行的时候,就能够解决对一个脚本加锁,来保证crontab里面,最多只会有两个进程。