ack在linux中使用crontab输出任何内容。
在crontab文件中(使用sudo crontab -e
编辑):
39 20 * * * /ext/test110.sh
cat /ext/test110.sh
将显示
#! /bin/sh
/usr/bin/ack "localhost" /etc/hosts > /ext/1.t
which ack > /ext/2.t
在cron之后,/ext
cat 2.t
将输出/usr/bin/ack
;
但是,1.t
中没有任何内容。
如果我在bash(4.3.30)中运行ack "localhost" /etc/hosts > /ext/3.t
或直接运行,
它将输出:127.0.0.1 localhost
似乎ack无法与cron一起使用。这个bug在哪里?谢谢。
uname -a
:
Linux xxx 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux
ack 2.14,在/ usr / bin / perl下在Perl 5.20.2下运行
答案 0 :(得分:1)
Ack可能会抛出一个错误,但你没有看到,因为你只是管道stdout并且错误被写入std err。
根据经验,除非你有充分的理由不这样做,否则总是抓住cron日志中的stderr。
使用以下命令重定向流:
[stream-no]>[destination]
如果没有给出流no,则bash将默认为1,这对应于stdout,所以:
>/file == 1>/file
您可以使用stderr file-no,2来执行stderr。将stderr发送到文件:
2>/file
您可以使用& file-no作为目标将流发送到另一个。您可以使用以下命令将stderr发送到与stdout相同的位置:
2>&1
所以在你的脚本中尝试这个。运行ack,将stderr与stdout一起发送到file-no 1,然后将所有进入file-no 1的内容发送到日志文件中。
/usr/bin/ack "localhost" /etc/hosts 2>&1 > /ext/1.t
检查输出。我打赌你现在得到一些文字,很可能是一个你无法智能修复的错误。
答案 1 :(得分:0)
/usr/bin/ack --nofilter "localhost" /etc/hosts > /ext/1.t
有效。