2012-01-11 3 views
0

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

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

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

запись хрон является:

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

(я это работает каждую минуту для отладки)

Проблема BIG здесь, когда она запускается и запускается, заключается в том, что она очищает ip.txt от любого содержимого, которое оно может иметь. Кроме того, у меня есть еще один скрипт, который делает то же самое с временем безотказной работы, и он работает без каких-либо проблем, которые просто путают. Я также попробовал >>, который, казалось, давал одинаковые результаты

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

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

ответ

3

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

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

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

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

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

3

Ваш скрипт должен иметь строку «хижину» в верхней части:

#!/bin/sh 

хотя это абсолютно не требуется.

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

Но вам не нужно отдельный сценарий, чтобы сделать перенаправление; Вы можете использовать > или >> в самых хронах:

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

И по крайней мере на моей системе, по умолчанию $PATH для хрон рабочих мест является /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 
+0

ах, я знал, что это должно быть что-то вроде этого. он на самом деле находится в/sbin/и меняет его на/sbin/ifconfig. – Drake

+1

Вы можете принять ответ как правильный, щелкнув значок галочки рядом с ним. Как только у вас будет 15 очков репутации (что не должно длиться долго), вы также можете повысить один или несколько ответов, если вы так склонны. –

3

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

# Cron ifconfig piping is broken 
eth0ipIC=`/sbin/ifconfig eth0` 
eth0ip=`echo $eth0ipIC|awk '{print $7}'|awk -F: '{print $2}'` 
Смежные вопросы