我想使用的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
谁能帮麻烦拍摄问题?
这听起来像有一些环境的脚本里面的依赖 - 本质上,它假定它在这一运行环境的东西,当你用手运行它是正确的,但不能当的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。
尝试写入/tmp
可以由任何用户都可以写。 即改变/Users/turtle/Desktop/data/data.txt
到/tmp/my_data.txt
如果这是你的输出文件。
在你的.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