编程语言
首页 > 编程语言> > python-OS X 10.10.3 launchctl权限被拒绝

python-OS X 10.10.3 launchctl权限被拒绝

作者:互联网

我执行launchctl start com.xxx.xxx.plist

我可以找到AutoMakeLog.err及其内容:

Traceback (most recent call last):
File "/Users/xxxx/Downloads/Kevin/auto.py", line 67, in <module>
output = open(file_name, 'w')
IOError: [Errno 13] Permission denied: '2015-04-22-09:15:40.log'

plist内容:

<array>
  <string>/Users/xxxx/Downloads/Kevin/auto.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
    <key>Minute</key>
    <integer>30</integer>
    <key>Hour</key>
    <integer>08</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/xxxx/Downloads/Kevin/AutoMakeLog.log</string>
<key>StandardErrorPath</key>
<string>/Users/xxx/Downloads/Kevin/AutoMakeLog.err</string>

auto.sh

#!/bin/sh
/usr/bin/python /Users/xxxx/Downloads/Kevin/auto.py

自动

file_name = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
file_name += '.log'
output = open(file_name, 'w')
output.writelines(response.text)
output.close()

auto.sh和auto.py的配置为777

PS:我直接执行auto.sh没有任何错误.

解决方法:

甚至OSX上特定于用户的启动作业都以/作为当前目录执行.

由于auto.py创建的文件仅包含文件名,没有路径,因此它会有效地尝试在/中创建文件,并且由于权限不足而失败.

因此,可以更改为当前用户可以在其中创建文件的目录,或者指定一个显式路径.例如(假设导入操作系统):

file_name = os.getenv('HOME') + '/' + time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))

至于如何直接运行python脚本,而无需中间shell脚本:

在您的plist文件中,指定要执行的命令,如下所示:

  <key>ProgramArguments</key>
  <array>
    <string>python</string>
    <string>/Users/xxxx/Downloads/Kevin/auto.py</string>
  </array>

请注意,您无需指定python的路径,因为它在启动时运行您的工作时位于$PATH中.

但是,请注意,$PATH包含的条目少于您在Terminal中看到的条目,并且值得注意的是/ user / local / bin;值是(自OSX 10.10.3起):

/usr/bin:/bin:/usr/sbin:/sbin

标签:shell,launchctl,python,macos
来源: https://codeday.me/bug/20191028/1952409.html