Bash 当 cron 运行 时脚本失败 - mktemp 不输出任何内容
Bash script failing when run by cron - mktemp outputting nothing
我有一个 shell 脚本,当我手动 运行 它时它可以工作,但是当 运行 通过 cron 时它会默默地失败。我已将其缩减为一个非常小的示例:
#!/usr/bin/env bash
echo "HERE:"
echo $(mktemp tmp.XXXXXXXXXX)
如果我从命令行运行,它输出HERE:
和一个新的临时文件名。
但是如果我从这样的 cron 文件中 运行 它,我只会得到 HERE:
后跟一个空行:
SHELL=/bin/bash
HOME=/
MAILTO=”me@example.com”
0 5 * * * /home/phil/test.sh > /home/phil/cron.log
有什么区别?我也试过使用 /bin/mktemp
,但没有改变。
问题是脚本从 cron 启动时试图在根目录中创建临时文件,但它没有这样做的权限。
cron 配置文件包含 HOME=/
。脚本启动时,当前目录为 /
。传递给 mktemp
的模板仅包含文件名,因此 mktemp
尝试在当前目录中创建临时文件,它是 /
.
$ HOME=/
$ cd
$ mktemp tmp.XXXXXXXXXX
mktemp: failed to create file via template ‘tmp.XXXXXXXXXX’: Permission denied
我有一个 shell 脚本,当我手动 运行 它时它可以工作,但是当 运行 通过 cron 时它会默默地失败。我已将其缩减为一个非常小的示例:
#!/usr/bin/env bash
echo "HERE:"
echo $(mktemp tmp.XXXXXXXXXX)
如果我从命令行运行,它输出HERE:
和一个新的临时文件名。
但是如果我从这样的 cron 文件中 运行 它,我只会得到 HERE:
后跟一个空行:
SHELL=/bin/bash
HOME=/
MAILTO=”me@example.com”
0 5 * * * /home/phil/test.sh > /home/phil/cron.log
有什么区别?我也试过使用 /bin/mktemp
,但没有改变。
问题是脚本从 cron 启动时试图在根目录中创建临时文件,但它没有这样做的权限。
cron 配置文件包含 HOME=/
。脚本启动时,当前目录为 /
。传递给 mktemp
的模板仅包含文件名,因此 mktemp
尝试在当前目录中创建临时文件,它是 /
.
$ HOME=/
$ cd
$ mktemp tmp.XXXXXXXXXX
mktemp: failed to create file via template ‘tmp.XXXXXXXXXX’: Permission denied