LINUX.ORG.RU

Ох уж эти переменные


0

0

Ребята подскажите пожалуста как побороть вот такую вещь. Написал я на Kylix маленькое консольное приложение. Решил ее засунуть в Nagios. Программка работае из под пользователя в нагиос в консоле как часы. Но когда он запускает ее сомостоятельно результат ноль. Нечего не выводит. Пришлось зубускать этот бинарник при помощи sh. Я не селен в этих переменных и добавил все скопом.
#!/bin/bash
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSION='3.00.16(2)-release'
BSNUM=14
CLASS=beginner
COLUMNS=120
DIRSTACK=()
DISPLAY=:0.0
ENV=/root/.bashrc
GCONF_TMPDIR=/tmp
GNOME_DISABLE_CRASH_DIALOG=1
GROUPS=()
GRP_TOGGLE=caps_toggle
G_FILENAME_ENCODING=@locale
HISTCONTROL=ignorespace
HISTFILE=/home/nagios/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home/nagios
HOSTNAME=DMurashko.bee.vimpelcom.ru
HOSTTYPE=i586
IFS=$' \t\n'
INPUTRC=/etc/inputrc
JAVA_HOME=/usr/local/java/jdk1.5.0_06/
JAVA_PATH=/usr/local/java/jdk1.5.0_06/
KBCHARSET=koi8-u
KEYBOARD=ru
KEYTABLE=ru4
LANG=ru_RU
LANGUAGE=ru_RU:ru
LC_ADDRESS=ru_RU
LC_COLLATE=ru_RU
LC_CTYPE=ru_RU
LC_IDENTIFICATION=ru_RU
LC_MEASUREMENT=ru_RU
LC_MESSAGES=ru_RU
LC_MONETARY=ru_RU
LC_NAME=ru_RU
LC_NUMERIC=ru_RU
LC_PAPER=ru_RU
LC_SOURCED=1
LC_TELEPHONE=ru_RU
LC_TIME=ru_RU
LD_LIBRARY_PATH=/usr/lib/kld
LESS=-MM
LESSKEY=/etc/.less
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LIBSAFE=no
LINES=38
LOGNAME=nagios
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33; 01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*. btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31 :*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31: *.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01; 35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:'
LS_OPTIONS='-F --color=auto'
MACHTYPE=i586-mandrake-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
MC_SID=25705
MC_TMPDIR=/home/nagios/tmp/mc-nagios
META_CLASS=powerpack
NLSPATH=/usr/share/locale/%l/%N
OLDPWD=/home
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin :/root/bin:/usr/java/jdk1.5.0_06/bin:/usr/local/bin:/root/bin:/usr/java/jdk1.5.0 _06/bin:/usr/local/bin
PIPESTATUS=([0]="0")
PROMPT_COMMAND='pwd>&7;kill -STOP $$'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home/nagios
PYTHONSTARTUP=/etc/pythonrc.py
QTDIR=/usr/lib/qt3/
SCREENDIR=/root/tmp
SECURE_LEVEL=2
SECURITY=2
SHELL=/bin/bash
SHLVL=3
TERM=xterm
TMOUT=0
TMP=/home/nagios/tmp
TMPDIR=/home/nagios/tmp
UMASK_ROOT=022
UMASK_USER=022
USER=nagios
USERNAME=root
XAUTHORITY=/home/nagios/.xauthl5PU2v
XDG_CONFIG_DIRS=/var/lib/menu-xdg
XDG_DATA_DIRS=/var/lib/menu-xdg:/usr/share
_=/home/nagios
bash205='3.00.16(2)-release'
bash205b='3.00.16(2)-release'
bash3='3.00.16(2)-release'

export LC_ADDRESS LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_SOURCED LC_TELEPHONE LC_TIME LD_LIBRARY_PATH
export PATH
#cd /usr/local/nagios/libexec/
exec /usr/local/nagios/libexec/check_hp_load $1 $2

все сразу заработало.
Ребята подскажите что именно нужно для этого калиса? И возможно ли где нить прописать это все чтобы избавится от sh файла? Чтобы запускать только один бинарник!

anonymous

что значит результат 0?

если в командной строке набрать

/usr/local/nagios/libexec/check_hp_load

что выводится на экран? совсем ничего? причём тут переменные окружения?

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

если написать то результат будет тот что надо. Тоесть скрипт отработается. А если он сам запустится при помощи демона то результат нулевой. Проверял при помощи перенаправления результата в файл. Файл создается но он пуст!

anonymous
()

Из всех переменных, что ты написал, экспортятся только те, которые написаны в последних строчках после слова export, смело можешь выкидывать оттуда все, что начинается с "LC_", т.е. остаются всего две переменные -- LD_LIBRARY_PATH и PATH. Их можно оставить -- хз что у тебя там бинарник использует внутрях. Переменные по умолчанию для юзера можно прописать в его домашний .bashrc (ну это, конечно, если шелл у юзера bash), если надо более глобально (для всех) - /etc/environment.

Есть одна мысль, у юзера nagios вообще есть права на запуск этого бинарника?

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

Что-то я гоню с утра в понедельник.. В данном случае все описанные переменные работают для текущей комманды.

kvit
()
Ответ на: комментарий от jackLucas

>а если перенаправить в файл ещё и вывод ошибок 2>/some.errors.txt ?

а по умолчанию ввывод ошибок разве не на экран? тогда какой смысл?

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

>а по умолчанию ввывод ошибок разве не на экран? тогда какой смысл?

Ну зачем же путать стандартные потоки с экраном? Если перенаправляешь поток с помощью символа ">" то по умолчанию перенаправляется только STDOUT. Чтобы перенаправить туда же и поток ошибки, обычно используется такая схема:

..... > some_file 2>&1

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

>Ну зачем же путать стандартные потоки с экраном? Если >перенаправляешь поток с помощью символа ">" то по умолчанию >перенаправляется только STDOUT. Чтобы перенаправить туда же и поток >ошибки, обычно используется такая схема:

попробуй запустить следующее в баше: echo -en '#include <iostream>\nmain(){std::cerr << "Kuda vivalivautsa oshibki po umolchaniu?";}' > test.cpp && g++ test.cpp -o temp-run && ./temp-run && rm ./temp-run ./test.cpp

потом скажи мне куда направился СТАНДАРТНЫЙ поток ошибок? в /dev/null?

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

Вот блин говоришь человеку про Фому, он тебе про Ерему..

То, что это все вываливается на экран, совершенно не означает, что будет писаться в файл при таком перенаправлении:

<command> > some_file

А пойдет в файл в этом случае _только_ STDOUT. Поток же ошибок, как вы изволили выразиться, так и будет идти на экран -- с этим кто-то спорил? Если не доходит - попробуй запустить что угодно в консоли и направить поток в файл.

P.S. Вы вообще представляете себе, для чего нужны логи и каким образом они ведуться?

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

э-э-э, kvit, а ты с самого начала эту ветку читал? подчеркну, наиболее важное:

>Но когда он запускает ее сомостоятельно результат ноль. Нечего не >выводит.

>а если перенаправить в файл ещё и вывод ошибок 2>/some.errors.txt ? >или тоже пусто?

конечно пусто, если по умолчанию ничего не выводиться

>Чтобы перенаправить туда же и поток ошибки, обычно используется >такая схема: >..... > some_file 2>&1

а теперь объясни мне как дебилу, ЧТО ты будешь перенаправлять в файл, если ни БУЯ нет!!! (см. первый пост)

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

читаем внимательно:

> А если он сам запустится при помощи демона то результат нулевой.

а что он там куда напишет при помощи демона?

поэтому интересен был вывод ошибок

не отрабатывает прога скорее всего из-за некорректных путей к библиотекам (LD_LIBRARY_PATH, etc)

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

пожалуй на что следует обратить внимание в первом посте, так на это:

> LD_LIBRARY_PATH=/usr/lib/kld

jackLucas
()
Ответ на: комментарий от ale

>конечно пусто, если по умолчанию ничего не выводиться

Откуда такая информация? Если файл нормально исполняется из консоли и не отрабатывается при автоматическом запуске с помощью сервиса, вполне возможно, что он что-то пишет в STDERR при этом и увидеть это можно _только_перенаправив_поток_ошибки_ в файл.

Напиши примитивный скрипт, например

#!/bin/bash ls /asdfasdfasdf > some_file

и запихай его в крон. Теперь покажи мне, каким образом ты увидишь сообщение типа:

ls: /asdfasdfasdf: No such file or directory

А some_file у тебя создастся и будет пустым. Ситуация похожа? На какой экран у тебя в этом случае вывалится сообщение?

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

каюс что такое Nagios не знаю.
каюс что не сразу увидел "А если он сам запустится при помощи демона то результат нулевой".
НО!!!

попробуем усложнить пример, написанный мной:
echo -en '#include <iostream>\nmain(){std::cerr << "Kuda vivalivautsa oshibki po umolchaniu?";}' > test.cpp && g++ test.cpp -o temp-run && echo -en '#include <iostream>\n#include<stdio.h>\n#include<unistd.h>\nmain(){pid_ t child;\nchild=fork();\nif(child==0)execvp("./temp-run",NULL);}' > test2.cpp && g++ test2.cpp -o temp-run2 && ./temp-run2 && rm ./temp-run ./temp-run2 test2.cpp test.cpp

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

p.s. конечно все выше изложенное верно если не было перенаправления потоков в самой программе
p.p.s kvit, для логов существует поток stdlog!

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

>каюс что такое Nagios не знаю. каюс что не сразу увидел "А если он сам запустится при помощи демона то результат нулевой". НО!!!

Лучше поздно, чем никогда..

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

>p.p.s kvit, для логов существует поток stdlog!

Объясняю подробнее. По работе приходится часто писать скрипты и пихать их в крон. Чтобы иметь представление оо том, как у тебя все работает, очень удобно создавать 2 лог файла, которые содержат различные потоки -- непосредственно вывод и файл с ошибками.

А stdlog это у нас уже стандартный поток? Нука предложи способ логировать, к примеру, вывод каких-нибудь стандартных утилит используя stdlog?

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

>ale, кому и что ты пытаешься доказать своими примерами? Ты либо
>покажи прямо где я не прав касаемо данной ситуации либо не
>выделывайся.

первначально, каюс, не увидел что сабж запускается из демона, и говорил к тому, что cerr бессмысленно отделять в файл, если:
1 процесс запускается из консоли
2 демон не перенаправляет потоки, запуская сабж

з.ы. если рвать сообщения от процесса, то тогда уж все сразу, используя "&>".

>Объясняю подробнее. По работе приходится часто писать скрипты и
>пихать их в крон. Чтобы иметь представление оо том, как у тебя все
>работает, очень удобно создавать 2 лог файла, которые содержат
>различные потоки -- непосредственно вывод и файл с ошибками.
угу, а потом сличать, после чего какая ошибка появилась =)

>А stdlog это у нас уже стандартный поток?
стандарт ISO/IEC 14882
тем более что поток, описаный в одном заголовочном классе (ostream) с cout,cerr можно считать не стандратным?

>Нука предложи способ логировать, к примеру, вывод каких-нибудь
>стандартных утилит используя stdlog?
смотреть класс slog http://www.gnu.org/software/commoncpp/docs/refman/html/class_slog.html
точнее метод clogEnable
http://www.gnu.org/software/commoncpp/docs/refman/html/class_slog.html#a8
написано "This is enabled by the default class constructor."
пример: sysklogd, файл: syslogd.c Описанный класс slog не вызывает метод clogEnable впринципе, посему вся инфа, идущая через этот демон так же летит и в clog. еще нужны примеры?

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

>угу, а потом сличать, после чего какая ошибка появилась =)

В этом нет необходимости, очень часто важен сам факт и время. К тому же stdout часто нужен без "примесей" для дальнейшего использования.

>смотреть класс slog http://www.gnu.org/software/commoncpp/docs/refman/html/class_slog.html и т.д

пожалуйста применимо к данной ситуации, либо к чему-то более жизненному. Например раз в сутки с помощью scp копируются файлы соответствующие определенному шаблону на удаленный хост. А потом сравним у кого проще, идет? А может ты вообще предлагаешь кучу утилит переписать самому? Нахрена? Тем более, когда существуют стандартные готовые решения.

>з.ы. если рвать сообщения от процесса, то тогда уж все сразу, используя "&>".

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

>к тому, что cerr бессмысленно отделять в файл, если: 1 процесс запускается из консоли 2 демон не перенаправляет потоки, запуская сабж

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

Ну и еще про бессмысленность, я вот в консоли хочу посмотреть на какой-то процесс strace-ом. Имеет ли тут смысл поток в файл направить, а потом уже поизучать? Или ты всю инфу вообще слету воспринимаешь?

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

>Ну и еще про бессмысленность, я вот в консоли хочу посмотреть на >какой-то процесс strace-ом. Имеет ли тут смысл поток в файл >направить, а потом уже поизучать? Или ты всю инфу вообще слету >воспринимаешь?

м-м-м... где я в этом треде и вообще писал, что перенаправление это зло? перенаправление - это сссупер

>Да бога ради, делай как удобнее, я ж тебе ничего не навязываю. именно, все делается как удобнее, и я высказыва{ю,л} мнение, что для диагностический целей, отделять чисто поток ошибок - не правильно.

>А может ты вообще предлагаешь кучу утилит переписать самому? >Нахрена? Тем более, когда существуют стандартные готовые решения. именно стандартные готовые решения, как например sysklogd использует clog, и любые процессы, его использующие так же кидают инфу в clog

я не говорю, что надо везде все переписать и использовать clog. я опровергаю вот это высказывание:"А stdlog это у нас уже стандартный поток?" т.к. clog именно стандарт, и существуют программы следующие этому стандарту (пример привел)

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

мммм да! Спасибо всем. Нечего не понял из выше перечисленного! оставлю как есть. ))))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.