Условия, которые вы описываете, не будут удовлетворены HashMap
. Поскольку процесс обновления карты не является атомарным, вы можете встретить карту в недопустимом состоянии. Многократные записи могут оставить это в поврежденном состоянии. ConcurrentHashMap (1.5 или более поздняя версия) делает то, что вы хотите.
Зачем реализовывать это самостоятельно? Существующая утилита, такая как daemon или Debian start-stop-daemon
, с большей вероятностью справится с другими сложными вещами, связанными с запуском долгоживущих серверных процессов.
В любом случае, когда вы запустите службы, поместите ее pid в / var / run /
, а затем заставьте вашу команду ps
просто искать этот идентификатор процесса и проверять, что это правильный процесс . В Linux вы можете просто посмотреть / proc /
, чтобы убедиться, что он указывает на правильный исполняемый файл.
Please don't reinvent init. Your OS has capabilities to do this that require nearly no system resources and will definitely do it better and more reliably than anything you can reproduce.
Classic Linux has /etc/inittab
Ubuntu has /etc/event.d (upstart)
OS X has launchd
Solaris has smf
Следующий код проверяет данный процесс в заданном интервале и перезапускает его.
#Restarts a given process if it is finished.
#Compatible with Python 2.5, tested on Windows XP.
import threading
import time
import subprocess
class ProcessChecker(threading.Thread):
def __init__(self, process_path, check_interval):
threading.Thread.__init__(self)
self.process_path = process_path
self.check_interval = check_interval
def run (self):
while(1):
time.sleep(self.check_interval)
if self.is_ok():
self.make_sure_process_is_running()
def is_ok(self):
ok = True
#do the database locks, client data corruption check here,
#and return true/false
return ok
def make_sure_process_is_running(self):
#This call is blocking, it will wait for the
#other sub process to be finished.
retval = subprocess.call(self.process_path)
def main():
process_path = "notepad.exe"
check_interval = 1 #In seconds
pm = ProcessChecker(process_path, check_interval)
pm.start()
print "Checker started..."
if __name__ == "__main__":
main()
Сам не пробовал, но есть модуль Python System Information которые можно использовать для поиска процессов и получения информации о них. AFAIR существует класс ProcessTable
, который можно использовать для проверки запущенных процессов, но, похоже, он не очень хорошо документирован ...
Я бы пошел по маршруту из командной строки (это проще, имхо), пока вы проверяете только каждую секунду или две, использование ресурсов должно быть бесконечно малым по сравнению с доступной обработкой в любой системе меньше старше 10 лет.