(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
然后(重新)启动您的服务器。
我有一个 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
然后(重新)启动您的服务器。