ack 在 linux 中使用 crontab 不输出任何内容

ack outputs nothing using crontab in linux

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

中有1.t和2.t

cat 2.t会输出/usr/bin/ack; 但是,1.t.

中没有任何内容

如果我运行 ack "localhost" /etc/hosts > /ext/3.t in bash (4.3.30) 或者直接sh, 它将输出:127.0.0.1 localhost

似乎 ack 无法使用 cron。错误在哪里?谢谢。

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,运行 在 Perl 5.20.2 下 /usr/bin/perl

Ack 可能会抛出一个错误,但您没有看到,因为您只是通过管道传输 stdout 并且错误被写入 std err。

根据经验,除非有充分的理由不这样做,否则请始终在 cron 日志中获取 stderr。

使用以下命令重定向流:

 [stream-no]>[destination]

如果没有给出流号 bash 将默认为 1,对应于 stdout 所以:

>/file == 1>/file

您可以使用 stderr 文件执行 stderr-no,2. 将 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 

并检查输出。我打赌你现在收到了一些文本,很可能是一个你无法智能修复的错误。

/usr/bin/ack --nofilter "localhost" /etc/hosts > /ext/1.t 有效。

详见https://github.com/beyondgrep/ack2/issues/649