Используйте файл pid. У вас есть известное местоположение, "/ path / to / pidfile", и при запуске вы делаете что-то вроде этого (частично псевдокод, потому что я готовлю кофе и не хочу так много работать):
import os, os.path
pidfilePath = """/path/to/pidfile"""
if os.path.exists(pidfilePath):
pidfile = open(pidfilePath,"r")
pidString = pidfile.read()
if <pidString is equal to os.getpid()>:
# something is real weird
Sys.exit(BADCODE)
else:
<use ps or pidof to see if the process with pid pidString is still running>
if <process with pid == 'pidString' is still running>:
Sys.exit(ALREADAYRUNNING)
else:
# the previous server must have crashed
<log server had crashed>
<reopen pidfilePath for writing>
pidfile.write(os.getpid())
else:
<open pidfilePath for writing>
pidfile.write(os.getpid())
Итак, другими словами, вы проверяете, существует ли pid-файл; если нет, напишите свой pid в этот файл. Если pid-файл существует, проверьте, является ли pid pid запущенного процесса; если так, то у вас запущен еще один живой процесс, так что просто выключите его. Если нет, то предыдущий процесс завершился сбоем, поэтому запишите его, а затем запишите свой собственный pid в файл вместо старого. Затем продолжайте.