【问题标题】:(re)start python script with applescript(重新)用applescript启动python脚本
【发布时间】:2016-11-30 05:59:11
【问题描述】:

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

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

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

【问题讨论】:

  • 这太宽泛了。请附上脚本、服务器以及您到目前为止所做的工作。
  • python脚本的内容真的无所谓。这是一个无限循环,这就是 applescript 需要知道的所有内容。另外,我确实写了到目前为止所做的事情:'do shell script "python server.py"' 是一个启动服务器的 applescript。我需要知道如何再次关闭它。

标签: python shell applescript restart


【解决方案1】:

注意 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),并返回 PID (进程 ID),如果有的话。

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

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

【讨论】:

    【解决方案2】:

    在shell 上,如果您执行ps aux | grep python\ server.py | head -n1,您将获得运行server.py 的进程的ID。然后您可以使用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

    【讨论】:

    • 看起来它几乎可以工作,但我收到一个错误:“sh: line 0: kill: socks python\\ /Volumes/path/server.py | head -n1 | python -c 'import sys; print(sys.stdin.read().split()[1])': 参数必须是进程或作业 ID"
    • 我的脚本是:do shell script "kill -9 \"socks python\\ /Volumes/path/server.py |头-n1 | python -c '导入系统; print(sys.stdin.read().split()[1])'\" && python /Volumes/path/server.py"
    • @FlorianDietz:抱歉,我使用了您计算机上不存在的别名。查看编辑。此外,您需要将脚本更改为 grep server.py 而不是 server.py 的完整路径
    • 我得到了同样的错误:do shell script "kill -9 \"ps aux python\\ grep server.py |头-n1 | python -c '导入系统; print(sys.stdin.read().split()[1])'\" && python /Volumes/path/server.py"
    • @FlorianDietz:注意是`ps aux,而不是"ps aux。注意反引号 - 它在 TAB 键上方
    猜你喜欢
    • 2020-09-13
    • 2010-12-17
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多