使用Python启动ctl minimal工作示例

2024-04-28 22:33:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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>

这个plist文件看起来不错,因为我得到了以下信息:

plutil -lint com.turtle.script.plist
com.turtle.script.plist: OK

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

/usr/bin/python /Users/turtle/Desktop/turtle.py /Users/turtle/Desktop/data/data.txt

我通过以下途径加载此plist:

   launchctl load -w -F com.turtle.script.plist

我也试过:

sudo launchctl load -w -F com.turtle.script.plist

我加载这个作业,python脚本应该将一个文件写到磁盘上。但是没有文件被生成。我检查这份工作的依据是:

sudo launchctl list | grep com.turtle.script.plist

输出为:

- 1 com.turtle.script.plist

有人能帮忙解决这个问题吗?


Tags: 文件key脚本comdatastringversionscript
3条回答

尝试写入任何用户都可以写入的/tmp。i、 e.如果是输出文件,则将/Users/turtle/Desktop/data/data.txt更改为/tmp/my_data.txt

听起来脚本内部有一些环境依赖性——本质上,它假设它运行的环境是正确的,当您手动运行它时是正确的,但当launchd运行它时则不是。如果对剧本一无所知,很难指出这可能是什么,但我可以提出一些建议:

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

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

    当您以根用户身份运行launchctl(例如sudo launchctl load)时,它将与launchd的系统实例交互,以管理启动守护程序——在系统上下文中以根用户身份运行的项。

    你必须根据这个脚本的功能来决定哪个是合适的。

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

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

    <key>StandardOutPath</key>
    <string>/tmp/turtle.out</string>
    <key>StandardErrorPath</key>
    <string>/tmp/turtle.err</string>
    

    编辑脚本以添加调试输出可能会有帮助,因此您可以详细了解它的工作方式(/不工作)。

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

~/Library/LaunchAgents中的.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>local.tf.check_up</string>
    <key>Program</key>
    <string>/Users/tf/.bin/check_up.py</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/local.tf.check_up.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/local.tf.check_up.stdout</string>
    <key>StartInterval</key>
    <integer>60</integer>
    <key>WorkingDirectory</key>
    <string>/tmp/</string>
</dict>
</plist>

你的脚本/Users/tf/.bin/check_up.py

#!/opt/local/bin/python

f = open('/Users/tf/Desktop/test.txt', 'a')
f.write('hello again 4\n')
f.close()

请注意,我使用的python来自MacPorts,它位于/opt/local/bin/。如果使用不同的python解释器,请用返回的$ which python替换上面的行。

请确保脚本是可执行的,并且只有您具有写访问权限:

$ chmod 755 ~/.bin/check_up.py

要测试脚本,请运行脚本并确保其正常工作:

$ ~/.bin/check_up.py

加载启动代理:

$ launchctl load ~/Library/LaunchAgents/local.tf.check_up.plist

相关问题 更多 >