Я не знаю, можете ли вы описать это как лучшую практику, но я бы использовал файл pid. Вот фрагмент, аналогичный тому, который я использовал несколько раз, чтобы убедиться, что запущен только один экземпляр определенного приложения.
import os, sys
PID_FILE = '/path/to/somewhere.pid'
if os.path.exists( PID_FILE ):
pid = int(open( PID_FILE,'rb').read().rstrip('\n'))
if len(os.popen('ps %i' % pid).read().split('\n')) > 2:
print "Already Running as pid: %i" % pid
sys.exit(1)
# If we get here, we know that the app is not running so we can start a new one...
pf = open(PID_FILE,'wb')
pf.write('%i\n' % os.getpid())
pf.close()
if __name__ == '__main__':
#Do something here!
pass
Как я уже сказал, это похоже на то, что я использовал, но я просто переписал этот фрагмент, чтобы быть немного более элегантным. Но это должно объяснить общую концепцию! Надеюсь, это поможет.
Вот небольшая модификация, которая должна устранить любые проблемы, возникающие в результате сбоя процесса.
Этот код не только подтвердит, что файл pid существует, но и, что pid в файле все еще жив и что pid остается тем же исполняемым файлом.
import os, sys
PID_FILE = '/path/to/somewhere.pid'
if os.path.exists( PID_FILE ):
pid = int(open( PID_FILE,'rb').read().rstrip('\n'))
pinfo = os.popen('ps %i' % pid).read().split('\n')
if len( pinfo ) > 2:
# You might need to modify this to your own usage...
if pinfo[1].count( sys.argv[0] ):
# Varify that the process found by 'ps' really is still running...
print "Already Running as pid: %i" % pid
sys.exit(1)
# If we get here, we know that the app is not running so we can start a new one...
pf = open(PID_FILE,'wb')
pf.write('%i\n' % os.getpid())
pf.close()
if __name__ == '__main__':
#Do something here!
pass
После этого я просто оставляю файл pid, так как вам не нужно беспокоиться о ложном срабатывании. Обратите внимание, что вам может потребоваться изменить второй этап проверки в соответствии с вашими конкретными потребностями!