我想使用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
有人能帮忙解决这个问题吗?
尝试写入任何用户都可以写入的
/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以记录脚本的输出,并查看其中是否包含任何错误消息或其他错误指示:
编辑脚本以添加调试输出可能会有帮助,因此您可以详细了解它的工作方式(/不工作)。
脚本是否依赖于特定的工作目录和/或环境变量?如果是,请将适当的
WorkingDirectory
和/或EnvironmentVariables
项添加到.plist。~/Library/LaunchAgents
中的.plist文件:你的脚本
/Users/tf/.bin/check_up.py
:请注意,我使用的
python
来自MacPorts,它位于/opt/local/bin/
。如果使用不同的python解释器,请用返回的$ which python
替换上面的行。请确保脚本是可执行的,并且只有您具有写访问权限:
要测试脚本,请运行脚本并确保其正常工作:
加载启动代理:
相关问题 更多 >
编程相关推荐