使用基于pgrep的方法确定python脚本是否正在运行是不可靠的。例如:> ps -ef | grep 'python sleep.py'
userid 21107 2069 0 12:51 pts/3 00:00:00 python sleep.py
userid 21292 2069 0 13:08 pts/3 00:00:00 grep python sleep.py
> pgrep 'python sleep.py'
>
根据运行的python脚本的名称识别它时的其他困难:实际的python字符串可能不同,具体取决于脚本的执行方式,例如,它可能如下所示:
/usr/bin/python2.7 sleep.py如果脚本是指向实际文件的符号链接,并且可以从两个位置执行,则使用os.path.abspath(__file__)方法在进程名中定位脚本可能会失败
示例:> cat abs_path.py
import os
print os.path.abspath(__file__)
> ls -l abs_path.py
lrwxrwxrwx 1 userid at 15 Apr 22 13:22 abs_path.py -> bin/abs_path.py
> python abs_path.py
/home/userid/abs_path.py
> python bin/abs_path.py
/home/userid/bin/abs_path.py进程(包括来自python脚本的进程)实际上可以在执行期间更改它们的名称(在脚本的情况下,可能不是真的)
我个人倾向于让脚本在一个独特的、众所周知的位置创建一个pidfile,在这个位置放置自己的pid。这使得确定可能已经在运行的进程的pid更加可靠。
在创建pidfile并可靠地写入self的pid时,仍然需要考虑竞争条件。通常,重新检查文件内容并在检测到不匹配时自杀足以确保至多存在一个正在运行的流程实例,而不管流程的实际名称如何。