Запись в лог-файл в bash скрипте

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

kadabrik
Сообщения: 20

Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Имеется скрипт, мониторящий в бесконечном цикле php-процессы. Следит за их памятью, убивает\запускает. Свои действия пишет в лог-файл. Так вот столкнулся с такой проблемой: после команды запуска php-скрипта прекращается любая запись в лог.

echo "starting new server.." >> $logfile
php -q /home/kadabrik/webroot/test/index.php server_start=request_start >> /dev/null &


Хотя сам скрипт благополучно висит дальше в памяти, выполняет свою работу, но молчит как партизан. Строка "starting new server.." будет последней в логе. Если запускать php-процессы не требуется, то он будет успешно писать в лог все, что нужно.

В чем здесь проблема, чего я недопонимаю?
Спасибо сказали:
IMB
Сообщения: 2566
ОС: Debian

Re: Запись в лог-файл в bash скрипте

Сообщение IMB »

Помоему последним амперсандом & Вы отправляете процесс на задний фон и управляющий скрипт просто дальше не идет.
Привели бы весь скрипт, а то гадание получается.
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Вот весь код: http://paste.org.ru/?pd0ns4

Амперсандом просто запускаю пхп-скрипт в фоне. sh скрипт в это время благополучно крутится дальше и делает свою работу.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Запись в лог-файл в bash скрипте

Сообщение /dev/random »

А запускаемый php-скрипт к этому логу случайно не обращается?
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Да нет, не обращается. По строке запуска видно что его вывод направляется в /dev/null
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Запись в лог-файл в bash скрипте

Сообщение pcodr »

Попробуйте поток ошибок тоже в /dev/null перенаправить при запуске php.

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

php smth.php >/dev/null 2>/dev/null &
remote system type is unix
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

pcodr писал(а):
19.11.2009 12:54
Попробуйте поток ошибок тоже в /dev/null перенаправить при запуске php.

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

php smth.php >/dev/null 2>/dev/null &


Не помогло.. результат все тот же.
Спасибо сказали:
Аватара пользователя
Boboms
Сообщения: 535
Статус: И это - правда!
ОС: Debian Lenin

Re: Запись в лог-файл в bash скрипте

Сообщение Boboms »

1. ИМХО, не нравится мне
logfile="log/controller"_`date +%F`.log

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

2. php -q /home/kadabrik/webroot/test/index.php server_start=request_start >> /dev/null &

У тебя второй процесс в бекграунде, попробуй первый (т.е. твой скрипт) вывести в фореграунд - вызвать.
Нет подписи...
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Boboms писал(а):
19.11.2009 17:13
1. ИМХО, не нравится мне
logfile="log/controller"_`date +%F`.log

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

2. php -q /home/kadabrik/webroot/test/index.php server_start=request_start >> /dev/null &

У тебя второй процесс в бекграунде, попробуй первый (т.е. твой скрипт) вывести в фореграунд - вызвать.


По пункту 1. Нормально формирует имя файла, создает и пишет в него. Ведь даже без переделоок путей в абсолютные - он пишет логи в этот файл, начинает писать. Ровно до момента вызова внешнего php скрипта. После вызова - молчит (но работает дальше).

По пункту 2. Как вывести в фореграунд? Просто с консоли его вызвать? Или вызвать его самого в скрипте? Но тогда рекурсия какая-то безумная получается. Или я неправильно понял?
Спасибо сказали:
Аватара пользователя
Boboms
Сообщения: 535
Статус: И это - правда!
ОС: Debian Lenin

Re: Запись в лог-файл в bash скрипте

Сообщение Boboms »

kadabrik писал(а):
19.11.2009 21:26
Boboms писал(а):
19.11.2009 17:13
1. ИМХО, не нравится мне logfile="log/controller"_`date +%F`.log - есть предположение, что он путь к файлу не находит, вот и не пишет туда. Попробуй абсолютный путь прописать для экперима. 2. php -q /home/kadabrik/webroot/test/index.php server_start=request_start >> /dev/null & У тебя второй процесс в бекграунде, попробуй первый (т.е. твой скрипт) вывести в фореграунд - вызвать.
По пункту 1. Нормально формирует имя файла, создает и пишет в него. Ведь даже без переделоок путей в абсолютные - он пишет логи в этот файл, начинает писать. Ровно до момента вызова внешнего php скрипта. После вызова - молчит (но работает дальше). По пункту 2. Как вывести в фореграунд? Просто с консоли его вызвать? Или вызвать его самого в скрипте? Но тогда рекурсия какая-то безумная получается. Или я неправильно понял?


По пункту 1. Что будет после вывода echo "$PWD" > 1.txt
Нет подписи...
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Boboms - огромное спасибо. Как я мог не увидеть этой очевидной причины раньше? После запуска php-скрипта путь в $logfile указывался относительно php скрипта))) Указал полный путь к папке логов - все работает как часы, никакой больше мистики.
Спасибо сказали:
Аватара пользователя
Boboms
Сообщения: 535
Статус: И это - правда!
ОС: Debian Lenin

Re: Запись в лог-файл в bash скрипте

Сообщение Boboms »

kadabrik писал(а):
20.11.2009 18:13
Boboms - огромное спасибо. Как я мог не увидеть этой очевидной причины раньше? После запуска php-скрипта путь в $logfile указывался относительно php скрипта))) Указал полный путь к папке логов - все работает как часы, никакой больше мистики.


Да я сам просто с похожим позавчера трахался. Благо коньяк был хороший :blush: По аналогии, так сказать.
Нет подписи...
Спасибо сказали:
Аватара пользователя
tarapulka
Сообщения: 2

Re: Запись в лог-файл в bash скрипте

Сообщение tarapulka »

Да я сам просто с похожим позавчера трахался. Благо коньяк был хороший :blush: По аналогии, так сказать.
[quote]
Что то мне и коньяк не помогает в таких случаях!)))
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Ну вот теперь я совсем озадачен. Насколько велика разница в sh-скриптах для Linux и FreeBSD? Перебрались на хостинг с FreeBSD и скрипты перестали работать. По логам как-то не могу понять что там происходит.. то скрипт не видит запущенные процессы, не убивает их, запускает новые. То видит и работает. Мистика.

Какие основные различия с скриптингах? Или где можно почитать насчет этого?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Запись в лог-файл в bash скрипте

Сообщение /dev/random »

kadabrik писал(а):
04.12.2009 21:02
Ну вот теперь я совсем озадачен. Насколько велика разница в sh-скриптах для Linux и FreeBSD? Перебрались на хостинг с FreeBSD и скрипты перестали работать. По логам как-то не могу понять что там происходит.. то скрипт не видит запущенные процессы, не убивает их, запускает новые. То видит и работает. Мистика.

Какие основные различия с скриптингах? Или где можно почитать насчет этого?

Если вы и там, и там используете bash и установили GNU'тые версии sed и прочего, то разницы никакой. Но проблема в том, что по-умолчанию там вовсе не баш и совершенно другие версии утилит.
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Локализовал проблему:

Сделал следующий скрипт:

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

#! /bin/sh
cpida=`ps aux | egrep nardy_controller.sh | egrep -v egrep | awk '{print $2}'`
echo $cpida > /usr/home/korogames/data/www/file.log
echo "test" >> /usr/home/korogames/data/www/file.log


При запуске вручную через ssh выводит в файл file.log - PID процесса и строчку test. При запуске этого скрипта через крон (от имени того же самого пользователя) с параметрами test.sh > /dev/null 2>&1 в логфайле получаю следующее:
Terminated
test


Что это за Terminated? В чем тут проблема? Отчасти из-за таких вещей на Freebsd у меня некорректно работают вышеупомянутые скрипты. Причем только если их вешать на крон. В ручном режиме через ssh все работает чудесно. Куда копать?
Спасибо сказали:
Аватара пользователя
Boboms
Сообщения: 535
Статус: И это - правда!
ОС: Debian Lenin

Re: Запись в лог-файл в bash скрипте

Сообщение Boboms »

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

#!/bin/sh[/]
Лишний пробел здесь ни к чему.

[code]
 #!/bin/sh -x

Опция -x неплоха для отлаживания скриптов. Она даёт построчный вывод - попробуй!

Крон - штука капризная (ИМХО!!!). У меня не запускается zenity с русскими буквами, с англ. - ОК.

Вот так я "парсил" крон:

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

 crontab -e

*/5 * * * * /home/vasja/scripts/my.scr.sh &>/home/vasja/sripts/оШибки.txt

ЗЫ: ИМХО!, поставь на Фрю Баш!
Нет подписи...
Спасибо сказали:
kadabrik
Сообщения: 20

Re: Запись в лог-файл в bash скрипте

Сообщение kadabrik »

Вот нашел в чем проблема: при выводе "ps ax" - через крон результаты в строках обрезаются после 80 символов. Через консоль не обрезаются и все работает. Пробовал в линуксе через крон - тоже не обрезаются. Неужели это такая фича FreeBSD? Никак ее обойти нельзя?
Спасибо сказали: