我有一个小巧的Python脚本,该脚本利用GitPython进行自我更新:
repo = git.Repo(search_parent_directories=True)
remote = repo.remotes.origin
remote.pull()
os.execl(sys.executable, *([sys.executable] + sys.argv))
此脚本在Ubuntu下作为systemd服务运行,但是我注意到这种安排存在问题。即,进行了许多僵尸进程并徘徊(其中18931是我的脚本的PID):
$ ps axo stat,ppid,pid,comm | grep -w defunct
Z 18931 4947 git <defunct>
Z 18931 5278 git <defunct>
Z 18931 5279 git <defunct>
[[ even more entries ]]
Z 18931 26955 git <defunct>
Z 18931 28551 git <defunct>
Z 18931 28552 git <defunct>
我该怎么做才能确保GitPython干净/优雅地关闭并确保这些僵尸不会缠住?
我使用os.execl()
作为就地重新启动脚本的方法,而不必手动重新启动或依靠systemd /任何其他服务来重新启动。我从this question开始实施了该方法,它似乎很好用。
我不确定这些僵尸进程是systemd还是脚本本身的结果,尽管我怀疑脚本本身是造成这种情况的原因。
理想情况下,我想继续使用execl()
,因为就我而言,它{相对而言}是干净的,并且似乎根本不会干扰systemd。但是,如果没有办法保留execl()
,我可以接受其他解决方案。