Ubuntu 14.04
我有一个简单的暴发户test.conf
:
root@ubuntutest:~# cat /etc/init/test.conf
expect fork
script
/root/test.py
end script
和简单的python脚本/root/test.py
:
root@ubuntutest:~# cat /root/test.py
#!/usr/bin/python
import time
print("Hello, World")
time.sleep(30)
print("Goodbye")
我开始测试作业,确保新贵跟踪正确的PID,等待脚本终止,但是新贵不会停止跟踪不存在的PID。因此,暴发户总是表明该作业正在运行(实际上不是)
root@ubuntutest:~# initctl status test
test stop/waiting
root@ubuntutest:~# initctl start test
test start/running, process 1859
root@ubuntutest:~# ps aux | grep 1859
root 1859 0.2 0.7 29832 7188 ? S 14:43 0:00 /usr/bin/python /root/test.py
root 1862 0.0 0.2 11760 2156 pts/0 S+ 14:43 0:00 grep --color=auto 1859
root@ubuntutest:~# ps aux | grep 1859
root 1864 0.0 0.2 11760 2224 pts/0 S+ 14:43 0:00 grep --color=auto 1859
root@ubuntutest:~# initctl status test
test start/running, process 1859
如果我从测试作业中删除expect fork
,那么一切正常(新贵曲目sh
而非python
除外)-我想了解我的代码出了什么问题?
如果我使用bash脚本而不是python,也会发生同样的情况:
#!/bin/bash
sleep 30
答案 0 :(得分:0)
为什么不简单地使用exec
节而不是script [...] end script
?
description "my python script"
start on startup
task
exec python
或者,您可以在脚本部分中执行python程序:
description "my python script, with extra steps"
start on started dbus
task
script
echo foo >/tmp/bar
exec python myscript.py
end script
作为一个简短的答案,为什么upstart认为该进程即使退出也仍然存在:shell进程拦截了当您的python程序退出时upstart通常会收到的信号,而Upstart无法知道该进程已经退出这些信号。