我想每分钟运行一次python脚本,使用launchd。我的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任何人都可以帮助解决这个问题吗?
发布于 2013-04-14 02:29:47
这听起来像是脚本中有一些环境依赖性--本质上,它假定运行环境的某些方面在手动运行时是正确的,但在启动运行时不是这样。在不了解脚本的情况下,很难指出这可能是什么,但我可以建议一些值得注意的事情:
sudo launchctl并不是launchctl的一个更强大的版本,它做了一些非常不同的事情。你需要找出你想要哪一个,并使用它。当您以普通用户(例如launchctl load)的身份运行launchctl时,它会与您的launchd的用户实例交互,以管理启动代理--在您的用户标识下在您的用户会话中运行的项目。
当您以根用户(例如sudo launchctl load)身份运行launchctl时,它将与launchd的系统实例交互,以管理启动守护进程--作为根用户在系统上下文中运行的项。
您必须根据此脚本的功能来决定哪一个是合适的。
tail -f /var/log/system.log),并查看它是否包含任何指示脚本失败原因的内容。
tmp /tmp/turtle.err
编辑脚本以添加调试输出可能会有所帮助,这样您就可以更多地了解它是如何工作的(/not working).
WorkingDirectory和/或EnvironmentVariables项添加到.plist。发布于 2013-04-14 01:21:40
尝试写入任何用户都可以写入的/tmp。例如,如果这是您的输出文件,请将/Users/turtle/Desktop/data/data.txt更改为/tmp/my_data.txt。
发布于 2015-09-22 18:23:31
~/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()请注意,我使用的是来自MacPorts的python,它位于/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.plisthttps://stackoverflow.com/questions/15990512
复制相似问题