Launchctl使用Python最小的工作示例(Launchctl minimal working

2019-08-22 18:47发布

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

我已经试过ALSE:

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

我加载此工作和Python脚本应该写出来一个文件到磁盘。 但是没有文件有史以来生产。 我检查与工作:

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

输出是:

- 1 com.turtle.script.plist

谁能帮麻烦拍摄问题?

Answer 1:

这听起来像有一些环境的脚本里面的依赖 - 本质上,它假定它在这一运行环境的东西,当你用手运行它是正确的,但不能当的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> 

    它可以帮助编辑脚本添加调试输出,这样你就可以告诉更多关于它是如何工作的(/不工作)。

  • 是否运行depend上具有特定的工作目录和/或环境变量? 如果是这样,添加适当的WorkingDirectory和/或EnvironmentVariables项目到的.plist。



Answer 2:

尝试写入/tmp可以由任何用户都可以写。 即改变/Users/turtle/Desktop/data/data.txt/tmp/my_data.txt如果这是你的输出文件。



Answer 3:

在你的.plist文件~/Library/LaunchAgents

<?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

加载LaunchAgent:

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


文章来源: Launchctl minimal working example with Python