linux的crontab里面,保证最多运行一个进程/两个进程/多个进程的解决方法

在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里面,最多只会有两个进程。

参考:

https://www.jianshu.com/p/e1c55ffea1cb

猜你喜欢

转载自blog.csdn.net/funnyPython/article/details/85245665