Страница 1 из 2

Разный разделитель в консоли и cron

Добавлено: 2011-08-08 17:07:48
kharkov_max
День добрый.

Пишу маленький скрипт, наткнулся на одну фичу.

Так - прекрасно работает из консоли

Код: Выделить всё

 sysctl -a | grep dev.cpu.\*.temp | awk -F" " '{print $2}' | awk -F"," '{print $1}' | while read cpu; do
        if [ $cpu  -gt $crit_cpu_temp ]; then
            echo "Critical CPU temperature CPU_temp=$cpu" >> $log
            echo "" >> $log
            echo 1 > $file_monitor_log_flag
        fi
    done
Но не работает через cron т.к если запускать через cron то разделителем 2го awk будет "."
Т.е. через cron работает так:

Код: Выделить всё

 sysctl -a | grep dev.cpu.\*.temp | awk -F" " '{print $2}' | awk -F"." '{print $1}' | while read cpu; do
        if [ $cpu  -gt $crit_cpu_temp ]; then
            echo "Critical CPU temperature CPU_temp=$cpu" >> $log
            echo "" >> $log
            echo 1 > $file_monitor_log_flag
        fi
    done
но не работает из консоли ...

Естесственно скрипт иногда придется запускать руками.
Пока выкрутился так:

Код: Выделить всё

 sysctl -a | grep dev.cpu.\*.temp | awk -F" " '{print $2}' | awk -F"," '{print $1}' | awk -F"." '{print $1}' | while read cpu; do
        if [ $cpu  -gt $crit_cpu_temp ]; then
            echo "Critical CPU temperature CPU_temp=$cpu" >> $log
            echo "" >> $log
            echo 1 > $file_monitor_log_flag
        fi
    done
Работает и через консоль и из cron.
Но все же хочется понять причину явления ...

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-08 20:04:47
Alex Keda
засуньте в файл и запускайте файл

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 7:32:31
kharkov_max
Alex Keda писал(а):засуньте в файл и запускайте файл
Из файла и запускаю ...

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 9:37:14
skeletor
Та же самая проблема :) Если узнаете в чём причина - обязательно поделитесь.

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 9:40:17
kpp
Покажите вывод

Код: Выделить всё

sysctl -a | grep dev.cpu.\*.temp
Пользователь один и тот же от кот. запускается крон и руками из консоли?

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 9:47:38
kharkov_max
kpp писал(а):Покажите вывод

Код: Выделить всё

sysctl -a | grep dev.cpu.\*.temp
Пользователь один и тот же от кот. запускается крон и руками из консоли?
В консоли запускаю под root.
А crontab правлю так: >crontab -u root -e

Т.е. crontab тоже пользователя root.

А что Вам даст вывод sysctl ?
В выводе из консоли разделитель ","

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 9:50:52
kpp
Нужно от чего-то оттолкнуться, если вы хотите разобраться.
Плпробуйте

Код: Выделить всё

sysctl -a | grep dev.cpu.\*.temp
в консоли и из крона: разделитель меняется?

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 9:55:32
kharkov_max
kpp писал(а):Нужно от чего-то оттолкнуться, если вы хотите разобраться.
Ну собственно в первом посте все изложено, как из консоли и как из cron.
Куски скрипта рабочие. т.е. в данный момент полный скрипт исправно работает через cron (3й вариант).

Извините, если Вам показалось что я грубо ответил. Ни чего не имел ввиду ...

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 9:57:06
kharkov_max
kpp писал(а):Нужно от чего-то оттолкнуться, если вы хотите разобраться.
Плпробуйте

Код: Выделить всё

sysctl -a | grep dev.cpu.\*.temp
в консоли и из крона: разделитель меняется?
Да - меняется ))))
Про это и вопрос ))).

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:00:28
kpp
1. Как вариант прописать полные пути ко всем утилитам.
Что хотите отобрать этим грепом:

Код: Выделить всё

grep dev.cpu.\*.temp
Возможно нужно записать так:

Код: Выделить всё

grep "dev\.cpu\.\*\.temp"

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:05:21
dmtr
а скрипт одним и тем же интерпретатором обрабатывается? в консоли у рута например bash, а из крона он не sh запускается случайно?

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:07:53
kharkov_max
Грепом хочу отобрать это:

Код: Выделить всё

> sysctl -a | grep dev.cpu.\*.temp
dev.cpu.0.temperature: 67,0C
dev.cpu.1.temperature: 63,0C
Это вывод из консоли.

Так:

Код: Выделить всё

grep "dev\.cpu\.\*\.temp"
не работает - вывод из консоли пустой.

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:08:46
kharkov_max
dmtr писал(а):а скрипт одним и тем же интерпретатором обрабатывается? в консоли у рута например bash, а из крона он не sh запускается случайно?

Код: Выделить всё

> crontab -u root -l
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
# min   hour    mday    month   wday    who     command
......
.......
Все sh

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:10:23
kharkov_max
Полные пути не помогают - проверял с ними, результат такой же.

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:20:16
kpp
Значит дело в утилите sysctl и в переменных окружения, а именно в переменной десятичный разделитель.

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:28:49
kharkov_max
kpp писал(а):Значит дело в утилите sysctl и в переменных окружения, а именно в переменной десятичный разделитель.
Не в этом ли дело ?

Код: Выделить всё

/etc>>env | grep SHELL
SHELL=/bin/csh

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-09 10:30:15
kpp
Переменная окружения LC_NUMERIC

Код: Выделить всё

locale -k decimal_point
LC_NUMERIC нужно установить в начале скрипта

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-10 8:40:17
kpp
2 kharkov_max
Ну так как? Решилось все?

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-10 11:42:15
kharkov_max
kpp писал(а):2 kharkov_max
Ну так как? Решилось все?
По идее Ваше предположение верно.

1. Подскажите пожалуйста как правильно изменить значение переменной через sh скрипт... (пока еще ни разу так не делал ...)
2. Нужно ли после изменения и выполения скрипта это значение вернуть назад в первоначальное состояние ?
3. Все таки каким образом при работе через консоль значение одно, а через cron другое, хотя пользователь один и тот же (причина) ?

Спасибо.

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-10 11:50:06
kpp
Например:

Код: Выделить всё

export LC_NUMERIC="ru_RU.KOI8-R"
Тогда десятичный разделитель будет запятая.
Возвращать назад не нужно.
Каждый скрипт (если он не запускается как ". скрипт" ) запускается в своем собственном экземпляре шелла, при запуске шелла инициализируются переменные окружения, переменные локали.
Если начальный логин под одним пользователем, а потом получение прав другого пользователя (через su) переменные окружения передаются всем порожденным шеллам.

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-10 12:12:10
f_andrey
kpp писал(а):Если начальный логин под одним пользователем, а потом получение прав другого пользователя (через su) переменные окружения передаются всем порожденным шеллам.
А если запустить su правильно, то он сделает всё что надо с окружением ;)

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-10 12:14:21
kharkov_max
kpp писал(а):Например:

Код: Выделить всё

export LC_NUMERIC="ru_RU.KOI8-R"
А как глобально применить ?
Что б в скриптах не прописывать ?

В rc.conf у меня есть:

Код: Выделить всё

font8x14="cp866-8x14"
font8x16="cp866b-8x16"
font8x8="cp866-8x8"
scrnmap="koi8-r2cp866"
keyrate="fast"

# clear_tmp_enable="YES"
keymap="ru.koi8-r"

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-11 11:23:55
kpp
После успешной регистрации выполняются файлы среды:
/etc/profile и .profile из домашнего каталога пользователя.
В пользовательском .profile можно прописать:

Код: Выделить всё

LC_NUMERIC="ru_RU.KOI8-R"
export LC_NUMERIC

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-19 8:17:20
Alex Keda
э... понял.
я в таких случаях прилепляю tr

Код: Выделить всё

srv0# grep -R "tr '" *
work/high.LA.notify.sh:la="`sysctl vm.loadavg | awk '{print $3}' | tr ',' '.' | awk -F '.' '{print $1}'`"
work/ddos.detect.sh:la_full="`sysctl vm.loadavg | awk '{print $3}' | tr ',' '.'`"
srv0# 

Re: Разный разделитель в консоли и cron

Добавлено: 2011-08-19 10:26:30
kpp
Что за запись такая?

Код: Выделить всё

work/high.LA.notify.sh:la="`sysctl vm.loadavg | awk '{print $3}' | tr ',' '.' | awk -F '.' '{print $1}'`"
work/high.LA.notify.sh - это скрипт, а как интерпретируется за именем скрипта двоеточие ?
Не встречал такого.
Скрипту передается уже проициализированная переменная la ?