ack терпит неудачу в cronjob, но работает нормально из командной строки - PullRequest
2 голосов
/ 20 апреля 2019

Я использую ack как часть скрипта bash для создания списка файлов MP4 из mysqldump. Файл дампа составляет около 15 МБ.

Вот моя строка:

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.

Я попытался поиграться с PATH, SHELL и т. Д. В crontab, чтобы убедиться, что среда такая же, как при ручном запуске. Ничто не имело значения.

Я пытался использовать все жесткие пути в crontab для подтверждения /usr/bin/ack просто чтобы быть уверенным. Не имеет значения.

Я пытался использовать bash -l для запуска скрипта. Не имеет значения.

Что я делаю не так?

Изменения для получения дополнительной информации:

  • Я использую Debian 7, но я также тестировал Ubuntu 18.04, и там появляется та же проблема.

  • Сервер работает exim4, все работает. По адресу MAILTO об этой строке в cron ничего не отправляется.

  • Нет ничего в / 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-match.txt и .ackerror.txt вернулись в виде 0 байтов.

1 Ответ

1 голос
/ 21 апреля 2019
  1. Это должно работать:

    * * * * * ack -o "https??://cdn.host.com\S+?\.mp4" /home/me/.dump.sql </dev/null > /home/me/.mp4-matches.txt
    
  2. Также вы, вероятно, можете использовать свою линию с опцией --nofilter

...