LINUX.ORG.RU

Как отладить выполнение скрипта в Crond?

 


0

2

Имеется навороченный bash+python скрипт, который запускается из-под крона. Запуск скрипта настроен от пользователя (назовем его user).

Если запускать скрипт в консоли просто от user, он нормально выполняется. Запуск того же скрипта из крона, судя по результату, происходит неудачно.

Экспериментально было выяснено, что запуск из-под крона действительно происходит от пользователя user, но переменные окружения совсем не те, что видны через команду export при логине в систему под пользователем user. Вообще, отличий много:

1. Похоже, что крон вызывает шелл /bin/sh, а обычный логин пользователя происходит в шелл /bin/bash.

2. Разный набор переменных окружения при запуске из Cron и обычном логине пользователя. В запуске из крона переменных всего 8, а при логине как пользователь - 25.

3. Разные значения переменных окружения. Например, сильно отличается переменаая PATH (при запуске из крона она содержит всего лишь «/usr/bin:/bin»)

Видимо, есть еще какие-то отличия, мне неведомые.

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

Проблема осложняется тем, что невозможно получить полный лог скрипта, так как скрипт специальным образом вызывает подпроцессы, которые могут отвалиться на опрациях I/O. И получить вывод этих подпроцессов невозможно. А в этих подпроцессах запускаются программы, которые, видимо, нормально не выполняются в окружении, созданном Cron.


Вопрос. Как можно отладить скрипт, вызываемый из Cron? Как увидеть в консоли работу скрипта в окружении, созданным для него Cron?

★★★★★

Пиши скрипт так, чтобы он не зависел от окружения. Это единственно верный путь.

anonymous ()

Экспериментально было выяснено, что ... переменные окружения совсем не те

Очередной братюня познаёт мир.

anonymous ()

Как увидеть в консоли работу скрипта в окружении, созданным для него Cron?

/home/user/myscript.sh >> /home/user/myscript.log

Можно еще посмотреть логи крона. Ну и анонимус все правильно сказал в первом комментарии.

edigaryev ★★★★★ ()
Ответ на: комментарий от edigaryev

/home/user/myscript.sh >> /home/user/myscript.log

Тогда в файл лога не попадет вывод ошибок. А как перенаправлять все выводы в файл (хотя бы стандартный + ошибок) я что-то не понимаю.


Можно еще посмотреть логи крона. Ну и анонимус все правильно сказал в первом комментарии.

Проблема в том, что не все от меня зависит. Например, я использую программу cloudfuse, в которой есть баг - она не берет параметры подключения из параметров команды, а берет их из конфига ~/.cloudfuse. И вполне возможно, что она не может работать из-под крона по каким-то еще причинам.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Тогда в файл лога не попадет вывод ошибок.

/home/user/myscript.sh &> /home/user/myscript.log

а берет их из конфига ~/.cloudfuse

export HOME=/home/user

Должно сработать.

Можешь еще с помощью strace посмотреть откуда именно программа пытается открыть необходимый ей файл.

edigaryev ★★★★★ ()
Ответ на: комментарий от Xintrea

А как перенаправлять все выводы в файл (хотя бы стандартный + ошибок) я что-то не понимаю.

открой для себя mysqcript.sh > log > 2>&1

leave ★★★★★ ()
Ответ на: комментарий от Xintrea

Тогда в файл лога не попадет вывод ошибок.

вообще крон по-умолчанию отправляет stdout/stderr выполняемой команды на почту, рекомендую её проверить.

maloi ★★★★★ ()

В кронтабе можно указать переменные насильно.

Lumi ★★★★★ ()
Ответ на: комментарий от leave

mysqcript.sh > log > 2>&1

Вот этого я не понимаю.

Как так, отправляется стандартный поток из скрипта в лог:

mysqcript.sh > log

А потом из лога (!) откуда-то берется поток ошибок и засовывается в стандартный поток.

log > 2>&1

Это выше моего понимания.

Xintrea ★★★★★ ()

source /etc/profile && /bin/bash -c '/path/to/my/script'

Как-то так. А насчёт PATH - его можно определять прям в cron-файле.

Alve ★★★★★ ()
Ответ на: комментарий от leave

там подробно объяснено

... на английском. Fix.

А есть ли вменяемое объяснение на русском?

Xintrea ★★★★★ ()
Ответ на: комментарий от leave

Кстати, коль пошла такая пьянка, вопрос.

Как перенаправить стандартный поток и поток ошибок в BASH-переменную?

Ну то есть, результат работы команды (стандартный поток) я могу получить так:

variable=`ls -l`

А как получить и стандартный поток, и поток ошибок?

Вот такое решение:

variable=`ls -l 2>&1`

будет работать, или в свете того что написано на StackOverflow, работать как ожидается не будет?

Xintrea ★★★★★ ()
Ответ на: комментарий от leave

обосновать сможешь?

Нет конечно. Это всего лишь догадка.

Возможно я слишком агресивно сформулировал свою мысль, но её суть в том, что причина недопонимания ТС'ом твоего сообщения кроется непосредственно в ошибке в твоем сообщении.

edigaryev ★★★★★ ()
Ответ на: комментарий от edigaryev

Блин, я уже сделал «эмулятор» среды, которую создает крон:

Эмулирование среды Cron. Чего еще не хватает?

Запускаю скрипт - все нормально, работает.

А из-под крона - нет.

Я уже не знаю, какие еще отличия среды в кроне от обычной могут быть.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А посмотреть что выводит непосредственно сам бэкапящий скрипт с помощью

/home/user/myscript.sh &> /home/user/myscript.log
ну или
/home/user/myscript.sh > /home/user/myscript.log 2>&1
так и не вышло?

edigaryev ★★★★★ ()
Ответ на: комментарий от edigaryev

Ну щас переделаю.

Я выше писал, что вывожу не в файл а в переменную, и мне нужно весь вывод (std и err) в переменной получить.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А зачем выводить в переменную в еще каком-то скрипте, если можно сказать cron'у:

* * * * * /home/edigaryev/test.sh > /home/edigaryev/test.log 2>&1

edigaryev ★★★★★ ()
Ответ на: комментарий от edigaryev

* * * * * /home/edigaryev/test.sh > /home/edigaryev/test.log 2>&1

Так нельзя, потому что процесс длительный, может до нескольких часов продолжаться.

Поэтому я и не пишу в файл, а пишу в переменную, и потом результат отправляю на почту.

А если буду в файл писать, то может получиться, что этот файл будет наполняться от разных процессов, и там вообще ничего не разберешь.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

файл будет наполняться от разных процессов

Можно конечно так сделать:

* * * * * /home/edigaryev/test.sh > /home/edigaryev/test-$RANDOM.log 2>&1
но я не понимаю зачем, если можно просто сделать так, чтобы крон запускал необходимый скрипт лишь один раз.

edigaryev ★★★★★ ()
Последнее исправление: edigaryev (всего исправлений: 1)
Ответ на: комментарий от edigaryev

Переделал на лог в уникальное имя файла.

В общем ничего не могу конкретно сказать, ибо сейчас неожиданно скрипт из-под крона сработал нормально.

Как-то это видимо еще зависит от состояния облачного хранилища, еще не понял при каких условиях. Переодически примонтированный каталог отваливается так, что монтирование остается. Он в MC виден красным цветом с символом $ впереди имени. Но у меня прописано жесткое перемонтирование, и оно всегда срабатывает если запускаю скрипт вручную. А вот из-под крона не перемонтируется. Нужно дождаться когда вот так подвиснет, и тогда скажу точнее - сработало из-под крона или нет.

Xintrea ★★★★★ ()
3 июля 2013 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.