ack ничего не выводит, используя crontab в linux

ack ничего не выводит, используя crontab в Linux.

В файле 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 в 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


person Zhilong Jia    schedule 14.09.2017    source источник
comment
Не работает. Спасибо. @Иниан   -  person Zhilong Jia    schedule 14.09.2017
comment
сделайте which ack, затем возьмите это значение и используйте его в своем вызове внутри вашего скрипта. То есть используйте /full/path/to/ack в своем сценарии. В противном случае добавьте это значение в переменную PATH. Подобные вопросы здесь задают каждый день, пожалуйста, научитесь пользоваться функцией поиска. Удачи.   -  person shellter    schedule 14.09.2017
comment
@shellter, это не работает. ваш ответ такой же, как у Иниана. Спасибо.   -  person Zhilong Jia    schedule 14.09.2017
comment
не работает Значит файлы /ext/1(2).t пусты? Является ли /ext чем-то помимо стандартной файловой системы дисковода? Что произойдет, если вы замените /ext на /tmp? Хм... Linux timemachine Это ваши компьютеры, или вы запускаете это на программно-аппаратном продукте, таком как NAS? Вы смотрели на man ack, есть ли что-нибудь об отсутствии вывода, когда он не запускается с терминального устройства? Удачи.   -  person shellter    schedule 14.09.2017
comment
не знал о ack. Очень интересно читать на странице руководства. Есть ли у вас файл .ackrc, и если да, то есть ли у вашего пользователя crontab такой же файл? Может быть, изменить свой сценарий, чтобы использовать --noenv? В противном случае есть почтовая группа для акка, так что, возможно, отправьте туда свою проблему. То, что вы описываете, выходит за рамки традиционных программ * nix. Отзыв закрытого голосования и ++, так как это не ваша обычная проблема с crontab. Удачи!   -  person shellter    schedule 14.09.2017
comment
@shellter не работает Значит файлы /ext/1(2).t пусты? (Только /ext/1.t пуст.); если заменить /ext на /tmp (та же проблема); Вы используете это на прошивке, такой как NAS? (Нет.); --noenv на это не влияет. Я отвечу, как только получу решение из других источников. Спасибо.   -  person Zhilong Jia    schedule 15.09.2017


Ответы (2)


Ack, вероятно, выдает ошибку, но вы не видите ее, поскольку вы только передаете стандартный вывод, а ошибка записывается в стандартный вывод err.

Как правило, всегда берите stderr из журнала cron, если у вас нет веских причин этого не делать.

Перенаправить поток командой:

 [stream-no]>[destination]

Если номер потока не указан, bash по умолчанию будет иметь значение 1, что соответствует стандартному выводу, поэтому:

>/file == 1>/file

Вы можете сделать stderr, используя файл stderr-no, 2. Чтобы отправить stderr в файл:

2>/file 

Вы можете отправить поток в другой, используя &file-no в качестве пункта назначения. Вы можете отправить stderr в то же место, что и stdout, с помощью:

2>&1

Итак, в вашем сценарии попробуйте это. запустите ack, отправьте stderr в файл № 1 вместе со стандартным выводом, а затем отправьте все, что приходит в файл № 1, в файл журнала.

/usr/bin/ack "localhost" /etc/hosts 2>&1 > /ext/1.t 

И проверьте вывод. Бьюсь об заклад, вы сейчас получите какой-то текст, скорее всего, ошибку, которую вы не можете разумно исправить.

person gbtimmon    schedule 14.09.2017
comment
Ничего не меняется с помощью /usr/bin/ack "localhost" /etc/hosts 2>&1 > /ext/1.t . Спасибо. Вы тестировали в своем Linux? Кстати, если есть ошибки, cron отправит письмо. Однако ни одно электронное письмо не было получено. - person Zhilong Jia; 14.09.2017
comment
разве ... > log 2>&1 не обычная формулировка? Раньше это имело значение ;-). В противном случае, и очень терпеливое объяснение перенаправления потоков! Всем удачи. - person shellter; 14.09.2017
comment
Не работает, все равно @shelter. Именно, перенаправления потока ясно объяснены. Спасибо. - person Zhilong Jia; 14.09.2017

/usr/bin/ack --nofilter "localhost" /etc/hosts > /ext/1.t работает.

Подробный ответ см. https://github.com/beyondgrep/ack2/issues/649

person Zhilong Jia    schedule 15.09.2017