我有一个在无限循环中运行的Python脚本(它是一个服务器)。
我想编写一个AppleScript,如果它尚未启动,将启动此脚本,否则强制退出并重新启动它。这样我就可以在编程时轻松更改服务器代码。
目前我只知道如何启动它:do shell script "python server.py"
答案 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
然后(重新)启动您的服务器。