Discussion:
скрипт и crontab
(слишком старое сообщение для ответа)
Alex Ivanov
2005-06-24 09:50:40 UTC
Permalink
Hi All.

Возникла глупейшая проблема - не могу запустить скрипт из crontab
есть такая строчка в crontab:
*/5 * * * * root /root/ipfw/ipfw_traffdump.sh

Т.е запускать скрипт каждые пять минут.
Cron в лог пишет каждые 5ть минут:
Jun 24 13:35:00 omzgate1 /usr/sbin/cron[33823]: (root) CMD
(/root/ipfw/ipfw_traffdump.sh)
Т.е. скрипт запускает.
Из консоли скрипт прекрасно работает, права на нем правильные, все ОК.

Но вот засада, при запуске из консоли скрипт отрабатывает _абсолютно_
корректно (тестировал под рутом из под /bin/sh), а при запуске из cron - не
хочет писать в базу.
Для теста в сам скрипт засунул строку:
date >> /tmp/td.log
Чтоб выводил дату своего запуска в лог, в нем все ок, т.е. скрипт запускается,
но сам почему-то ничего в базу ничего не пишет.
Отсюда вопрос - чем отличается запуск скрипта из cron от запуска из консоли
(ну кроме shell)?

Вот собственно сам скрипт:
[***@gate1.xxx.com]/home/orm> ll /root/ipfw/ipfw_traffdump.sh
-rwx------ 1 root wheel - 2332 Jun 24 13:21 /root/ipfw/ipfw_traffdump.sh
[***@gate1.xxx.com]/home/orm> cat /root/ipfw/ipfw_traffdump.sh
#!/bin/sh
fwcmd="/sbin/ipfw"

. /root/ipfw/ipfw_pipe_numbers.sh

date >> /tmp/td.log

#================ Inbound traffic

if [ -r /var/run/pipe.${in_pipe} ]; then
echo LOCK TABLES ${in_table} WRITE\; \
ALTER TABLE ${in_table} DISABLE KEYS\; | ${mysqlcmd}
${fwcmd} pipe ${in_pipe} show |\
tail -n +4 |\
awk " { print \$3, \$4, \$6 } "|\
awk -F[/\.\t\ ] " { print \$11, \$1, \$2, \$3, \$4, \$6, \$7,
\$8, \$9, \$5 } "|\
# sort -r -n |\
awk " { print ( \" INSERT INTO ${in_table} (
bytes,source_ip_1,source_ip_2,source_ip_3,source_ip_4,destination_ip_1,destinat
ion_ip_2,destination_ip_3,destination_ip_4,source_port ) VALUES ( \", \$1, \"
, \", \
\$2, \" , \",\
\$3, \" , \",\
\$4, \" , \",\
\$5, \" , \",\
\$6, \" , \",\
\$7, \" , \",\
\$8, \" , \",\
\$9, \" , \",\
\$10, \" ); \") } "|\
${mysqlcmd}
${fwcmd} pipe ${in_pipe} delete && rm /var/run/pipe.${in_pipe}
fi
${fwcmd} pipe ${in_pipe} config \
mask src-ip 0xffffffff \
dst-ip 0xffffffff \
src-port 0xffff \
dst-port 0x0000 \
buckets 65536 && echo xxx > /var/run/pipe.${in_pipe}





#=================== Outbound traffic

if [ -r /var/run/pipe.${out_pipe} ]; then
echo LOCK TABLES ${out_table} WRITE\; \
ALTER TABLE ${out_table} DISABLE KEYS\; | ${mysqlcmd}
${fwcmd} pipe ${out_pipe} show |\
tail -n +4 |\
awk " { print \$3, \$4, \$6 } "|\
awk -F[/\.\t\ ] " { print \$11, \$1, \$2, \$3, \$4, \$6, \$7,
\$8, \$9, \$10 } "|\
# sort -r -n |\
awk " { print ( \" INSERT INTO ${out_table} (
bytes,source_ip_1,source_ip_2,source_ip_3,source_ip_4,destination_ip_1,destinat
ion_ip_2,destination_ip_3,destination_ip_4,destination_port ) VALUES ( \",
\$1, \" , \", \
\$2, \" , \",\
\$3, \" , \",\
\$4, \" , \",\
\$5, \" , \",\
\$6, \" , \",\
\$7, \" , \",\
\$8, \" , \",\
\$9, \" , \",\
\$10, \" ); \") } "|\
${mysqlcmd}
${fwcmd} pipe ${out_pipe} delete && rm /var/run/pipe.${out_pipe}
fi
${fwcmd} pipe ${out_pipe} config \
mask src-ip 0xffffffff \
dst-ip 0xffffffff \
src-port 0x0000 \
dst-port 0xffff \
buckets 65536 && echo xxx > /var/run/pipe.${out_pipe}


echo UNLOCK TABLES\; \
ALTER TABLE ${in_table} ENABLE KEYS\; \
ALTER TABLE ${out_table} ENABLE KEYS\; | ${mysqlcmd}

[***@gate1.xxx.com]/home/orm> cat /root/ipfw/ipfw_pipe_numbers.sh
#!/bin/sh
export in_pipe="1"
export in_table="inbound"
export out_pipe="2"
export out_table="outbound"
export mysqlcmd="mysql traff"
#export mysqlcmd="cat"
[***@omzgate1.omzcrane.com]/home/orm> ll /root/ipfw/ipfw_pipe_numbers.sh
-rwx------ 1 root wheel - 156 Jun 16 12:10 /root/ipfw/ipfw_pipe_numbers.sh
Mykola Dzham
2005-06-24 10:40:16 UTC
Permalink
Post by Alex Ivanov
Hi All.
Возникла глупейшая проблема - не могу запустить скрипт из crontab
*/5 * * * * root /root/ipfw/ipfw_traffdump.sh
Т.е запускать скрипт каждые пять минут.
Jun 24 13:35:00 omzgate1 /usr/sbin/cron[33823]: (root) CMD
(/root/ipfw/ipfw_traffdump.sh)
Т.е. скрипт запускает.
Из консоли скрипт прекрасно работает, права на нем правильные, все ОК.
Но вот засада, при запуске из консоли скрипт отрабатывает _абсолютно_
корректно (тестировал под рутом из под /bin/sh), а при запуске из cron - не
хочет писать в базу.
date >> /tmp/td.log
Чтоб выводил дату своего запуска в лог, в нем все ок, т.е. скрипт запускается,
но сам почему-то ничего в базу ничего не пишет.
Отсюда вопрос - чем отличается запуск скрипта из cron от запуска из консоли
(ну кроме shell)?
Отличается еще переменной PATH , в частности обычно там отсутствует
/usr/local/bin и /usr/local/sbin

[dd]
Post by Alex Ivanov
#!/bin/sh
export in_pipe="1"
export in_table="inbound"
export out_pipe="2"
export out_table="outbound"
export mysqlcmd="mysql traff"
А программа mysql находится обычно где-то в /usr/local/bin/
--
LEFT-(UANIC|RIPE)
JID: ***@jabber.kiev.ua
Alex Ivanov
2005-06-24 12:08:06 UTC
Permalink
Post by Alex Ivanov
Отсюда вопрос - чем отличается запуск скрипта из cron от запуска из
консоли (ну кроме shell)?
MD> Отличается еще переменной PATH , в частности обычно там отсутствует
MD> /usr/local/bin и /usr/local/sbin
Спасибо, заработало.
А слона то я и не заметил... Наверно на эти грабли все наступали :)
В связи с этим вопрос - а зачем это? Типа секьюрность?
Eugene Grosbein
2005-06-24 13:36:24 UTC
Permalink
24 июн 2005, пятница, в 12:50 KRAST, Alex Ivanov написал(а):

AI> Возникла глупейшая проблема - не могу запустить скрипт из crontab
AI> есть такая строчка в crontab:
AI> */5 * * * * root
AI> /root/ipfw/ipfw_traffdump.sh

AI> Из консоли скрипт прекрасно работает, права на нем правильные, все ОК.
AI> Hо вот засада, при запуске из консоли скрипт отрабатывает _абсолютно_
AI> корректно (тестировал под рутом из под /bin/sh), а при запуске из cron -
AI> не
AI> хочет писать в базу.

AI> Чтоб выводил дату своего запуска в лог, в нем все ок, т.е. скрипт
AI> запускается,
AI> но сам почему-то ничего в базу ничего не пишет.
AI> Отсюда вопрос - чем отличается запуск скрипта из cron от запуска из
AI> консоли
AI> (ну кроме shell)?

Вставь в начало скрипта:

PATH=... # какой надо

Eugene
--
Прекрасны тонко отшлифованная драгоценность; победитель, раненный в бою;
слон во время течки; река, высыхающая зимой; луна на исходе; юная женщина,
изнуренная наслаждением, и даятель, отдавший все нищим. (Дхарма)
Alex Ivanov
2005-06-24 12:08:07 UTC
Permalink
Fri Jun 24 2005 17:36, Eugene Grosbein wrote to Alex Ivanov:

AI>> Отсюда вопрос - чем отличается запуск скрипта из cron от запуска из
AI>> консоли
AI>> (ну кроме shell)?
EG> Вставь в начало скрипта:
EG> PATH=... # какой надо
Спасибо, заработало :), все оказалось просто :)))
Eugene Grosbein
2005-06-24 15:17:26 UTC
Permalink
Post by Alex Ivanov
Отсюда вопрос - чем отличается запуск скрипта из cron от запуска из
консоли (ну кроме shell)?
MD>> Отличается еще переменной PATH , в частности обычно там отсутствует
MD>> /usr/local/bin и /usr/local/sbin
AI> Спасибо, заработало.
AI> А слона то я и не заметил... Hаверно на эти грабли все наступали :)
AI> В связи с этим вопрос - а зачем это? Типа секьюрность?

Если используешь системный /etc/crontab, посмотри на строчку PATH=
в начале файла. Это просто дефолт. PATH внутри скрипта его переопределяет.

Eugene
--
Пробуй, но не смей глотать
Eugene Grosbein
2005-06-24 19:03:11 UTC
Permalink
24 июн 2005, пятница, в 18:13 KRAST, Alex Ivanov написал(а):

AI> IMHO правильнее, чтоб окружение пользователя задавалось где-то в одном
AI> месте
AI> (/etc/login.conf, /etc/env.conf например, плюс что-то типа ~/.env или тому
AI> подобное) и цеплялось везде, независимо от шела - а уж если админу надо,
AI> то он
AI> должен иметь возможность (подчеркиваю, не необходимость) перекрыть его в
AI> crontab или любом сценарии, запускащем нужный демон/программу.

А так и есть. И не надо читать /etc/crontab по диагонали.

Eugene
--
Choose SMTP and wondering why the fsck you are logged on on a Sunday morning
Alex Ivanov
2005-06-24 16:35:31 UTC
Permalink
Fri Jun 24 2005 23:03, Eugene Grosbein wrote to Alex Ivanov:

AI>> IMHO правильнее, чтоб окружение пользователя задавалось где-то в одном
AI>> месте
AI>> (/etc/login.conf, /etc/env.conf например, плюс что-то типа ~/.env или
AI>> тому подобное) и цеплялось везде, независимо от шела - а уж если админу
AI>> надо, то он
AI>> должен иметь возможность (подчеркиваю, не необходимость) перекрыть его в
AI>> crontab или любом сценарии, запускащем нужный демон/программу.
EG> А так и есть. И не надо читать /etc/crontab по диагонали.
1. Т.е. если я уберу сторочку PATH из crontab то будет использоваться PATH по
умолчанию для юзера?
2. Где редактировать переменные для всех пользователей, и для конкретного
пользователя, чтобы они подцеплялись _независимо_ от шела, и от того,
залогинился ли пользователь или просто запустил bash под рутом?

P.S Извиняюсь за стиль, просто как я понял вы (ты?) предпочитаете кратко и по
существу :)
Vadim Goncharov
2005-06-25 05:50:32 UTC
Permalink
Hi Alex Ivanov!

On Fri, 24 Jun 2005 16:35:31 +0000 (UTC); Alex Ivanov wrote about 'Re: скрипт и crontab':

AI>>> IMHO правильнее, чтоб окружение пользователя задавалось где-то в одном
AI>>> месте
AI>>> (/etc/login.conf, /etc/env.conf например, плюс что-то типа ~/.env или
AI>>> тому подобное) и цеплялось везде, независимо от шела - а уж если админу
AI>>> надо, то он
AI>>> должен иметь возможность (подчеркиваю, не необходимость) перекрыть его в
AI>>> crontab или любом сценарии, запускащем нужный демон/программу.
EG>> А так и есть. И не надо читать /etc/crontab по диагонали.
AI> 1. Т.е. если я уберу сторочку PATH из crontab то будет использоваться PATH по
AI> умолчанию для юзера?

Сложно проверить? :)

AI> 2. Где редактировать переменные для всех пользователей, и для конкретного
AI> пользователя, чтобы они подцеплялись _независимо_ от шела, и от того,
AI> залогинился ли пользователь или просто запустил bash под рутом?

Дык сам же написал: /etc/login.conf (и ~/.login_conf)

AI> P.S Извиняюсь за стиль, просто как я понял вы (ты?) предпочитаете кратко и по
AI> существу :)

Книжки и маны читать полезно.
--
WBR, Vadim Goncharov. ICQ#166852181 mailto:***@mail.ru
[Moderator of RU.ANTI-ECOLOGY][FreeBSD][http://antigreen.org][LJ:/nuclight]
Eugene Grosbein
2005-06-24 20:09:46 UTC
Permalink
24 июн 2005, пятница, в 19:35 KRAST, Alex Ivanov написал(а):

AI>>> IMHO правильнее, чтоб окружение пользователя задавалось где-то в одном
AI>>> месте
AI>>> (/etc/login.conf, /etc/env.conf например, плюс что-то типа ~/.env или
AI>>> тому подобное) и цеплялось везде, независимо от шела - а уж если админу
AI>>> надо, то он
AI>>> должен иметь возможность (подчеркиваю, не необходимость) перекрыть его в
AI>>> crontab или любом сценарии, запускащем нужный демон/программу.
EG>> А так и есть. И не надо читать /etc/crontab по диагонали.
AI> 1. Т.е. если я уберу сторочку PATH из crontab то будет использоваться PATH
AI> по
AI> умолчанию для юзера?

Оказывается, cron - исключение. Он специально игнорирует настройки
environment окружающей среды, их ему положено задавать только в crontab.
Если не задать, будет /bin:/usr/bin. Век живи, век учись.
Впрочем, я всегда задавал в crontab. Hапример, на одной машине
задаю там CRON_JOB=yes. И некоторые задачи по присутствию этой переменной
определяют, запущены они кроном или интерактивно, и меняют свое
поведение от этого (test -t тут не годится).

AI> 2. Где редактировать переменные для всех пользователей, и для конкретного
AI> пользователя, чтобы они подцеплялись _независимо_ от шела, и от того,
AI> залогинился ли пользователь или просто запустил bash под рутом?

Hаписано в мане на шелл.

Eugene
--
Choose no friends
Alex Ivanov
2005-06-27 06:50:53 UTC
Permalink
Sat Jun 25 2005 00:09, Eugene Grosbein wrote to Alex Ivanov:

EG> Оказывается, cron - исключение. Он специально игнорирует настройки
EG> environment окружающей среды, их ему положено задавать только в crontab.
EG> Если не задать, будет /bin:/usr/bin. Век живи, век учись.
EG> Впрочем, я всегда задавал в crontab. Hапример, на одной машине
EG> задаю там CRON_JOB=yes. И некоторые задачи по присутствию этой переменной
EG> определяют, запущены они кроном или интерактивно, и меняют свое
EG> поведение от этого (test -t тут не годится).
Забавно. Век живи, век учись.
А где можно найти описание причин такого поведения? В man cron?

AI>> 2. Где редактировать переменные для всех пользователей, и для
AI>> конкретного пользователя, чтобы они подцеплялись _независимо_ от шела,
AI>> и от того, залогинился ли пользователь или просто запустил bash под
AI>> рутом?
EG> Hаписано в мане на шелл.
По поводу мана на шел - в случае bash существует .bash_profile, который
стартует при логине и .bashrc который стартует в остальных случаях. А
сценарий, стартующий всегда - отсутствует. Вот и приходится делать вещи,
специфичные для ситуации в нужном скрипте, а потом запускать из него же некий
третий "общий" скрипт.
Мне кажется такое поведение не совсем логичным (хотя если поставить себя на
место разработчиков - можно понять, возникают куча вопросов, например в какой
послежовательности стартовать эти скрипты и т.д. Вот они просто и переложили
это на пользователя - типа если надо, сам пиши скрипты и все разруливай :)))
).
Eugene Grosbein
2005-06-27 10:17:04 UTC
Permalink
27 июн 2005, понедельник, в 09:50 KRAST, Alex Ivanov написал(а):

EG>> Оказывается, cron - исключение. Он специально игнорирует настройки
EG>> environment окружающей среды, их ему положено задавать только в crontab.
EG>> Если не задать, будет /bin:/usr/bin. Век живи, век учись.
EG>> Впрочем, я всегда задавал в crontab. Hапример, на одной машине
EG>> задаю там CRON_JOB=yes. И некоторые задачи по присутствию этой переменной
EG>> определяют, запущены они кроном или интерактивно, и меняют свое
EG>> поведение от этого (test -t тут не годится).
AI> Забавно. Век живи, век учись.
AI> А где можно найти описание причин такого поведения? В man cron?

Afaik, только в сорцах. Там есть такой комментарий:

/* Set user's entire context, but skip the environment
* as cron provides a separate interface for this
*/

Hаверное, таки зря он это делает. Теперь уже поздно менять, можно
поломать очень много работающего, что зависит от текущего поведения.

EG>> Hаписано в мане на шелл.
AI> По поводу мана на шел - в случае bash существует .bash_profile, который
AI> стартует при логине и .bashrc который стартует в остальных случаях. А
AI> сценарий, стартующий всегда - отсутствует. Вот и приходится делать вещи,
AI> специфичные для ситуации в нужном скрипте, а потом запускать из него же
AI> некий
AI> третий "общий" скрипт.

Hикаких проблем не вижу. Создаешь ~/.shrc и вызываешь его из обоих скриптов.

Eugene
--
Прекрасны тонко отшлифованная драгоценность; победитель, раненный в бою;
слон во время течки; река, высыхающая зимой; луна на исходе; юная женщина,
изнуренная наслаждением, и даятель, отдавший все нищим. (Дхарма)
Alex Ivanov
2005-06-27 09:02:29 UTC
Permalink
Mon Jun 27 2005 14:17, Eugene Grosbein wrote to Alex Ivanov:
AI>> А где можно найти описание причин такого поведения? В man cron?
EG> Afaik, только в сорцах. Там есть такой комментарий:
EG> /* Set user's entire context, but skip the environment
EG> * as cron provides a separate interface for this
EG> */
EG> Hаверное, таки зря он это делает. Теперь уже поздно менять, можно
EG> поломать очень много работающего, что зависит от текущего поведения.
Ну...
По поводу, что много сломает - не так уж и много, IMHO в большинстве случаев
адаптация скритов к cron сводилась к указанию полного пути к утилитам и
ручному указанию нужных переменных. И если менять - можно на первом этапе
crontab не трогать, т.е. по умолчанию там теже пути, а если их закоментить -
тогда остаются дефолты.
Или как вариант - прикрутить опцию командной строки, которая включает новое
поведение и добавить в /etc/defaults/rc.conf переменную типа
CRON_WITH_USERENV=NO ну и соответственно rc скрипты поправить :)))
Жалко только я в програминнге на С не силен :)

Кстати по поводу поломает - ситуевина с обработкой #! поломала гораздо больше
:)))
Как я уже писал в другом посте - скорее всего когда писался крон не до этого
было, а потом все привыкли :)))

EG> Hикаких проблем не вижу. Создаешь ~/.shrc и вызываешь его из обоих
EG> скриптов.
Да я собственно так и делаю, токо скрипт у меня зовется сразу .bashrc и
вызывается из .bash_profile

Loading...