使用Python启动最小的工作示例

tur*_*tle 4 python macos launchd

我想用launchd每分钟运行一个python脚本.我的plist文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.turtle.script.plist</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/python</string>
        <string>/Users/turtle/Desktop/turtle.py</string>
        <string>/Users/turtle/Desktop/data/data.txt</string>
    </array>
    <key>StartInterval</key>
    <integer>60</integer>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

这个plist文件看起来很好,因为我得到以下内容:

plutil -lint com.turtle.script.plist
com.turtle.script.plist: OK
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行脚本时,脚本可以正常工作:

/usr/bin/python /Users/turtle/Desktop/turtle.py /Users/turtle/Desktop/data/data.txt
Run Code Online (Sandbox Code Playgroud)

我通过以下方式加载此plist:

   launchctl load -w -F com.turtle.script.plist
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

sudo launchctl load -w -F com.turtle.script.plist
Run Code Online (Sandbox Code Playgroud)

我加载这个作业,python脚本应该写出一个文件到磁盘.但是没有生成任何文件.我检查了这份工作:

sudo launchctl list | grep com.turtle.script.plist
Run Code Online (Sandbox Code Playgroud)

输出是:

- 1 com.turtle.script.plist
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助解决问题吗?

Gor*_*son 5

这听起来像是脚本中存在一些环境依赖性 - 实质上,它假定它运行的环境是正确的,当你手动运行它时,而不是当launchd运行它时.在不了解脚本的情况下,很难指出这可能是什么,但我可以建议一些事情要看:

  • sudo launchctl不是一个更强大的版本launchctl,它做了一些显着不同的事情.你需要弄清楚你想要哪一个,并使用它.

    当您launchctl以普通用户身份运行时(例如launchctl load),它会与您的用户启动实例进行交互,以管理启动代理 - 在您的用户会话中以您的用户身份运行的项目.

    当您launchctl以root用户身份运行时(例如sudo launchctl load),它会与launchd的系统实例进行交互,以管理Launch Daemons - 以root用户身份在系统上下文中运行的项目.

    你必须根据这个脚本的作用来决定哪个是合适的.

  • 检查system.log(您可以使用Console实用程序查看它,或者tail -f /var/log/system.log)查看它是否包含任何指示脚本失败原因的内容.

  • 向launchd .plist添加条目以记录脚本的输出,并查看是否包含任何错误消息或其他错误指示​​:

    <key>StandardOutPath</key>
    <string>/tmp/turtle.out</string>
    <key>StandardErrorPath</key>
    <string>/tmp/turtle.err</string>
    
    Run Code Online (Sandbox Code Playgroud)

    编辑脚本以添加调试输出可能会有所帮助,因此您可以更多地了解它是如何工作的(/不工作).

  • 脚本是否依赖于具有特定的工作目录和/或环境变量?如果是这样,请在.plist中添加适当的WorkingDirectory和/或EnvironmentVariables项目.