(重新)用applescript启动python脚本

时间:2016-11-29 19:51:13

标签: python shell applescript restart

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

我想编写一个AppleScript,如果它尚未启动,将启动此脚本,否则强制退出并重新启动它。这样我就可以在编程时轻松更改服务器代码。

目前我只知道如何启动它:do shell script "python server.py"

2 个答案:

答案 0 :(得分:1)

在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

答案 1 :(得分:1)

请注意,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通过 regex 查找完整命令行(-f)的运行命令,需要完全匹配({ {1}}),并返回PID(进程ID),如果有的话。

    • 请注意,我使用了更抽象的正则表达式来强调-x(总是)将其搜索词视为正则表达式的事实。
      要将完整启动命令行指定为正则表达式,请使用pgrep - 请注意python ~/srv/server\.py - 转义\以获得完整的健壮性。
  • .会终止进程,如果找到了PID([ "$pid" ] && kill -9 $pid[ "$pid" ]的缩写,只有在{{1}时才会计算为真是非空的); [ -n "$pid" ]发送信号$pid,强制终止该过程。

  • -9然后(重新)启动您的服务器。

相关问题