Python不会运行整个shell脚本?

时间:2017-09-28 16:12:51

标签: python linux bash shell

从以下代码开始,我的目标是为我的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

它只显示两个进程并终止。

1 个答案:

答案 0 :(得分:1)

要重新启动(也就是说,当前流程),请不要使用call()(我假设为subprocess.call())。

相反,如果此代码是从bot.py本身运行的(并且该脚本可以使用有效的shebang执行):

os.execl(os.path.abspath(__file__), '_')

_是作为argv[0]传递的占位符。如果你愿意的话,你可以在其后添加其他命令行参数。

这会将bot.py的正在运行的实例替换为继承完全相同PID的新实例。