bash - ack 在 cronjob 中失败,但从命令行运行良好
问题描述
我正在使用ack
作为 bash 脚本的一部分从 mysqldump 构建 MP4 文件列表。转储文件约为 15mb。
这是我的台词:
ack -o "https??://cdn.host.com\S+?\.mp4" /home/me/.dump.sql > /home/me/.mp4-matches.txt
手动运行 bash 脚本时效果很好。我们得到这个.mp4-matches.txt
:
https://cdn.host.com/url/t_Foo/Foo.mp4
https://cdn.host.com/url/t_Bar/Bar.mp4
但是,当单独运行相同的命令作为 cronjob 时,它会生成一个空文件。
我不知道为什么它不能在 cron 中工作。
我尝试在 crontab 中摆弄 PATH、SHELL 等,以确保环境与手动运行相同。没有任何改变。
我已经尝试使用 crontab 中的所有硬路径/usr/bin/ack
来确认。没有什么不同。
我试过用bash -l
来启动脚本。没有什么不同。
我究竟做错了什么?
编辑以获取更多信息:
我正在运行 Debian 7,但我也在 Ubuntu 18.04 上进行了测试,同样的问题也出现在那里。
服务器正在运行 exim4,一切正常。关于 cron 中的这一行,没有任何内容被发送到 MAILTO 地址。
/var/log/syslog 或 /var/log/messages 中没有关于 cron 错误的任何内容
使用 bash
#!/bin/bash
crontab 中的任何地方都没有百分号 (%)。
crontab 看起来像这样:
MAILTO=myemail@address.com BASH=/bin/bash SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin 27 9 * * * /usr/bin/ack -o "https??://cdn.host.com\S+?\.mp4" /home/me/.dump.sql > /home/me/.mp4-matches.txt
是的,这是我的 crontab,而不是 root。
没有读取 .ackrc 文件。它在我的系统上的任何地方都不存在。
find / -iname ".ackrc"
什么也没返回。一个简单的表达式
"https://cdn.host.com/url/t_Foo/Foo.mp4"
仍然在 cron 中返回一个空文件。单引号和双引号都会在 cron 中产生空文件。
STERR 似乎也没有提供任何东西。运行
/usr/bin/ack -o 'https://cdn.host.com/url/t_Foo/Foo.mp4' /home/me/.dump.sql > /home/me/.mp4-matches.txt 2> /home/me/.ackerror.txt
将 .mp4-matches.txt 和 .ackerror.txt 文件都返回为 0 字节。
解决方案
这应该有效:
* * * * * ack -o "https??://cdn.host.com\S+?\.mp4" /home/me/.dump.sql </dev/null > /home/me/.mp4-matches.txt
您也可以将您的线路与
--nofilter
选项一起使用
推荐阅读
- tensorflow - 更改为使用 tf.data api 后,Keras 模型无法学习任何东西
- neo4j - 将 CSV 文件导入 Neo4J 需要很长时间
- java - Android Firebase:第二个连接的数据库不允许在规则中进行身份验证
- r - 非英语术语文档矩阵
- json - 加载捆绑在可执行文件中的 json 文件
- html - 容器 div 不适应子 Angular 组件高度
- java - 将括号括在 Excel 公式的文件名中
- javascript - 字段值的乘法
- python - 如何使用 python-pptx 按演示文稿中的顺序从 powerpoint 文本框中提取文本。
- git - 如何在 git 中获取旧版本的文件