Сценарий Bash не выполняется в Cron правильно

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

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

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

запись cron:

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

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

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

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

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

У вашего скрипта должна быть строка «shebang» наверху:

 #!/bin/sh 

хотя это не совсем необходимо.

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

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

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

И, по крайней мере, в моей системе, задание $PATH для заданий cron равно /usr/bin:/bin , но ifconfig is /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 

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

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

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

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

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

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

 # Cron ifconfig piping is broken eth0ipIC=`/sbin/ifconfig eth0` eth0ip=`echo $eth0ipIC|awk '{print $7}'|awk -F: '{print $2}'`