3

我执行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'

列表内容:

<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>

自动.sh

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

自动.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 有 chomd 777

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

4

2 回答 2

3

甚至OSX 上的用户特定 launchd作业也作为当前目录执行。/

由于仅使用文件名auto.py创建文件,没有 path,因此它有效地尝试在其中创建文件/并由于权限不足而失败。

因此,要么更改当前用户可以在其中创建文件的目录,要么指定显式路径;例如(假设import os):

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运行launchd您的作业时。

但是,请注意$PATH包含的条目比您在 中看到的要Terminal,并且明显的缺失/user/local/bin; 该值为(从 OSX 10.10.3 开始):

/usr/bin:/bin:/usr/sbin:/sbin
于 2015-04-22T04:54:08.380 回答
2

我正在添加此答案以提高可见性,尽管并未导致此问题中的原始问题。

由于macOS 10.14 Mojave launchd命令的变化,现在有更多的安全限制。如果您看到Permission denied用户拥有的文件和目录的错误,请参阅问:如何在 Mojave中授予对用户文件的 Root 访问权限以获得可能的修复。

于 2018-10-24T19:49:05.787 回答