从以下代码开始,我的目标是为我的python bot创建一个restart命令。
result = {
#cmds here
prfx and 'restart':lambda _: call('./restart.sh', shell=True),
}[cmd](_)
room.message(result)
我在这本词典中有很多命令,所以我总结了这种格式。
该命令调用shell脚本(restart.sh),并且应该终止僵尸程序进程(bot.py),然后引用另一个shell脚本,然后再次启动僵尸程序。
[restart.sh]
pgrep -f bot.py # pid
pkill -9 -f bot.py # kills the matching pid
sh ./start.sh #run start.sh
exit 0
[start.sh]
python bot.py
运行restart命令时,僵尸程序进程结束,不会继续执行脚本的其余部分 [例如:Bash]
Connecting to MySQL database...
connection established.
Connection closed.
ONLINE
[chatroom] Bot: ONLINE!: [ip]
[chatroom] user: >restart: [ip]
168747
169448
它只显示两个进程并终止。
答案 0 :(得分:1)
要重新启动(也就是说,当前流程),请不要使用call()
(我假设为subprocess.call()
)。
相反,如果此代码是从bot.py
本身运行的(并且该脚本可以使用有效的shebang执行):
os.execl(os.path.abspath(__file__), '_')
_
是作为argv[0]
传递的占位符。如果你愿意的话,你可以在其后添加其他命令行参数。
这会将bot.py
的正在运行的实例替换为继承完全相同PID的新实例。