Скрипт Bash не выполняется правильно в Cron - PullRequest
0 голосов
/ 11 января 2012

Итак, у меня есть скрипт bash, который должен передавать вывод ifconfig в текстовый файл каждый час.Как многие люди сталкивались, этот скрипт не работает должным образом при использовании cron.Однако большинство исправлений, которые я видел, не применимы в моем случае.Я четко указал все пути, у сценария есть разрешения на выполнение, и в конце файла cron есть новая строка.

достаточно креативно, мой скрипт ip.sh содержит:

ifconfig > /home/drake/Dropbox/maintenance_scripts/ip.txt

запись cron:

0 * * * *   /home/drake/Dropbox/maintenance_scripts/ip.sh

(у меня она запускается каждую минуту для отладки)

БОЛЬШАЯ проблема здесь, когда он работает и работает, заключается в том, чтоон очищает ip.txt от любого содержимого, которое может иметь.Кроме того, у меня есть другой скрипт, который точно так же работает с uptime, и он работает без каких-либо проблем, которые только что перепутали.Я также пытался >>, который, казалось, давал идентичные результаты

Итак, есть ли у кого-нибудь идеи, почему один сценарий может функционировать так, как ожидалось, а другой просто вылетел бы так?Это работает на моем сервере Ubuntu.Я использую Dropbox для синхронизации текстовых файлов

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Ваш скрипт должен иметь строку "shebang" вверху:

#!/bin/sh

, хотя это и не обязательно.

Скрипт перезаписывает ip.txt, потому что вы сказали это.Это то, что делает оператор перенаправления >.Если вы хотите добавить в конец файла, используйте >>.(Вы сказали, что пробовали это, с идентичными результатами. Я сомневаюсь, что это правда. Я подозреваю, что работа cron просто не производит никакого вывода, поэтому она ничего не добавляет к файлу.)

Но вы этого не делаетенужен отдельный скрипт просто для перенаправления;вы можете использовать > или >> в самом задании cron:

0 * * * *    ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt

И, по крайней мере, в моей системе по умолчанию $PATH для заданий cron /usr/bin:/bin, но ifconfig/sbin/ifconfig.Попробуйте which ifconfig или type ifconfig, чтобы увидеть, где ifconfig живет в вашей системе (мы оба используем Ubuntu, так что, вероятно, это одно и то же), и используйте полный путь в задании cron;например:

0 * * * *    /sbin/ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt

И если вы хотите видеть , когда выход изменился (я полагаю, это то, что вы проверяете), достаточно просто добавить временную метку:

0 * * * *    ( date ; /sbin/ifconfig ) >> /home/drake/Dropbox/maintenance_scripts/ip.txt
3 голосов
/ 10 декабря 2012

Попробуйте это, у меня с крона сработало. Обратите внимание, что вывод ifconfig может измениться с дистрибутива Linux на дистрибутив, поэтому вам может потребоваться настроить параметры awk.

# Cron ifconfig piping is broken
eth0ipIC=`/sbin/ifconfig eth0`
eth0ip=`echo $eth0ipIC|awk '{print $7}'|awk -F: '{print $2}'`
3 голосов
/ 11 января 2012

Сценарий ip.sh должен уничтожать файл ip.txt при каждом его запуске; затем программа ifconfig может ее заполнить. Итак, ваша проблема в том, что ifconfig этого не делает.

Обычная проблема при запуске вещей из cron - environment . Обратите внимание, что когда cron запускает команду, профиль не используется.

В этом случае я бы предположил, что параметр PATH в cron не включает каталог, в котором находится ifconfig (поэтому /sbin отсутствует в PATH). Очевидные обходные пути:

  • /sbin/ifconfig ...
  • export PATH=$PATH:/sbin; ifconfig ...

Я думаю, что простой запуск скрипта из файла crontab обычно является лучшим способом ведения бизнеса. Не изменяя настройки crontab, вы можете добавить отладочный код, изменить настройки среды и в любом случае поработать с вашим сердцем. Из-за сложных командных строк в файле crontab рано или поздно могут возникнуть проблемы в той или иной системе. Поэтому я думаю, что ваша система разумна - я использую несколько более сложную систему в моих собственных cron -загружаемых скриптах, но есть много общего. Ключевым моментом является то, что запись в crontab проста, а выполняемый скрипт - это то, где сложность скрыта.

...