首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python的Launchctl最小工作示例

使用Python的Launchctl最小工作示例
EN

Stack Overflow用户
提问于 2013-04-14 01:06:17
回答 3查看 9.8K关注 0票数 4

我想每分钟运行一次python脚本,使用launchd。我的plist文件看起来像这样:

代码语言:javascript
运行
复制
<?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文件看起来不错,因为我得到了以下内容:

代码语言:javascript
运行
复制
plutil -lint com.turtle.script.plist
com.turtle.script.plist: OK

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

代码语言:javascript
运行
复制
/usr/bin/python /Users/turtle/Desktop/turtle.py /Users/turtle/Desktop/data/data.txt

我通过以下方式加载这个plist:

代码语言:javascript
运行
复制
   launchctl load -w -F com.turtle.script.plist

我也试过了:

代码语言:javascript
运行
复制
sudo launchctl load -w -F com.turtle.script.plist

我加载了这个作业,python脚本应该会将一个文件写到磁盘上。但是,不会生成任何文件。我用以下命令检查工作:

代码语言:javascript
运行
复制
sudo launchctl list | grep com.turtle.script.plist

输出为:

代码语言:javascript
运行
复制
- 1 com.turtle.script.plist

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-14 02:29:47

这听起来像是脚本中有一些环境依赖性--本质上,它假定运行环境的某些方面在手动运行时是正确的,但在启动运行时不是这样。在不了解脚本的情况下,很难指出这可能是什么,但我可以建议一些值得注意的事情:

  • sudo launchctl并不是launchctl的一个更强大的版本,它做了一些非常不同的事情。你需要找出你想要哪一个,并使用它。

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

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

您必须根据此脚本的功能来决定哪一个是合适的。

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

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

tmp /tmp/turtle.err

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

  • Does脚本依赖于特定的工作目录和/或环境变量?如果是,请将相应的WorkingDirectory和/或EnvironmentVariables项添加到.plist。
票数 6
EN

Stack Overflow用户

发布于 2013-04-14 01:21:40

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

票数 1
EN

Stack Overflow用户

发布于 2015-09-22 18:23:31

~/Library/LaunchAgents中的.plist文件

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
#!/opt/local/bin/python

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

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

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

代码语言:javascript
运行
复制
$ chmod 755 ~/.bin/check_up.py

要测试该脚本:运行它并查看它是否正常工作:

代码语言:javascript
运行
复制
$ ~/.bin/check_up.py

加载LaunchAgent:

代码语言:javascript
运行
复制
$ launchctl load ~/Library/LaunchAgents/local.tf.check_up.plist
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15990512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档