(re)start python script with applescript

(re)start python script with applescript

我有一个 Python 无限循环运行的脚本(它是一个服务器)。

我想写一个 AppleScript 来启动这个脚本,如果它还没有启动,否则强制退出并重新启动它。这将使我在编程时更容易更改服务器代码。

目前我只知道怎么启动:do shell script "python server.py"

在 shell 上,如果您执行 ps aux | grep python\ server.py | head -n1,您将获得进程的 ID 运行 server.py。然后,您可以使用 kill -9 终止该进程并重新启动它:

kill -9 `ps aux | grep python\ server.py | head -n1 | python -c 'import sys; print(sys.stdin.read().split()[1])'`

那会杀了它。您现在要做的就是重新启动它:

python server.py

你可以将两者结合起来 &&:

kill -9 `ps aux | grep python\ server.py | head -n1 | python -c 'import sys; print(sys.stdin.read().split()[1])'` && python server.py

当然,您已经知道如何将其放入 do shell script!

请注意,AppleScript 的 do shell script 默认在 root 目录 (/) 中启动 shell (/bin/sh) , 所以你应该指定 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 通过 regex 对完整命令行(-f),需要完全匹配 (-x),以及 returns PID(进程 ID),如果有的话。

    • 请注意,我使用了更抽象的正则表达式来强调 pgrep(始终)将其搜索词视为 正则表达式.
      要将完整的启动命令行指定为正则表达式,请使用 python ~/srv/server\.py - 请注意 .\ 转义以获得完整的稳健性。
  • [ "$pid" ] && kill -9 $pid 终止进程,if 找到 PID([ "$pid" ][ -n "$pid" ] 的缩写并计算仅当 $pid 为非空时才为真); -9发送信号SIGKILL,强制终止进程。

  • python ~/srv/server.py 然后(重新)启动您的服务器。