ack 在 cronjob 中失败,但从命令行运行良好
ack fails in cronjob but runs fine from commandline
我使用 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"
仍然 returns 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
选项一起使用
我使用 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"
仍然 returns 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
选项一起使用