我有一个简单的 bash 脚本,它在命令行中运行时可以正常工作,但在 crontab 中却不行:
#!/bin/bash
PATH=/usr/bin:/bin
for f in /data/home/cwolff/tmp/*access_log*.txt;
do
egrep "r:[A-Z]+ \S+[^\.\s]{5} " $f >> $f.min
done
在 crontab 中运行时,它会输出空的 *.min 文件。我读到一些字符(如 %)需要在 crontab 中转义,但我没有使用它们中的任何一个。
答案1
小心使用像 这样的范围[A-Z]
,因为它的含义取决于语言环境。它可能是[ABC...]
,但也可能是[AaBbCc...]
。[:upper:]
定义明确。
因此,我最好的选择是检查登录 shell 与 cron 中的环境,尤其是LC_ALL, LC_COLLATE, LC_CTYPE, LANG
。
答案2
这可能是由权限引起的。
如果您有权限读取所有文件/data/home/cwolff/tmp/*access_log*.txt
,但运行此命令的 crontab 的用户却没有权限,那么您就会看到这种行为。
/data
如果使用不带no_root_squash
选项的 NFS 进行挂载并且 crontab 是 root 的,也会出现这种情况。
cron 作业的错误通常会通过邮件发送给相关用户。如果您没有花时间配置邮件设置,这些错误可能位于 中/var/spool/mail/user
。