我有一个在无限循环中运行的 Python 脚本(它是一个服务器)。
我想编写一个AppleScript,如果该脚本尚未启动,它将启动该脚本,否则强制退出并重新启动它。这将使我在编程时轻松更改服务器代码。
目前我只知道如何启动它:do shell script "python server.py"
最佳答案
请注意 AppleScript 的 do shell script
默认情况下,在 root 目录 ( /bin/sh
) 中启动 shell ( /
),因此您应该指定到 server.py
的显式路径
在下面的示例中,我将假设目录路径 ~/srv
.
这是 shell 命令:
pid=$(pgrep -fx 'python .*/server\.py'); [ "$pid" ] && kill -9 $pid; python ~/srv/server.py
作为 AppleScript 语句,包含在 do shell script
中- 请注意\
-逃脱的内心"
和\
字符:
do shell script "pid=$(pgrep -fx 'python .*/server\\.py'); [ \"$pid\" ] && kill -9 $pid; python ~/srv/server.py"
pgrep -fx '^python .*/server\.py$'
使用pgrep
通过正则表达式针对完整命令行 (-f
) 查找正在运行的命令,需要完全匹配 (-x
),并返回 PID(进程 ID)(如果有)。- 请注意,我使用了更抽象的正则表达式来强调
pgrep
(始终)将其搜索词视为正则表达式。
要将完整的启动命令行指定为正则表达式,请使用python ~/srv/server\.py
- 请注意\
-逃逸.
以实现完全的鲁棒性。
- 请注意,我使用了更抽象的正则表达式来强调
[ "$pid" ] && kill -9 $pid
如果找到 PID,则终止进程([ "$pid" ]
是[ -n "$pid" ]
的缩写,并且仅当$pid
非空时评估为 true);-9
发送信号SIGKILL
,强制终止进程。python ~/srv/server.py
然后(重新)启动您的服务器。
关于python - 使用 applescript (重新)启动 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40874607/