URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4323
[ Назад ]

Исходное сообщение
"Как притормозить init 0?"

Отправлено antoshkin , 02-Авг-16 07:44 
Добрый день, коллеги.
Сделал скрипт, который при старте и остановке системы посылает письмо мне.
Поместил его в init.d, сделал симлинки по науке для 3 и 5 уровня: S50message, K01message (при запуске последним, при остановке - первым).
Но вот незадача! Остановка происходит, видимо, очень быстро и параллельно, что сообщение-то он отправляет, но MTA его отправляет только в следующий раз после включения.
Как бы так сделать, чтобы MTA (postfix) не завершался, пока мой скрипт не отработает?
Даже в зависимостях я там поставил postfix (Required-Stop: postfix) - не помогает.
Если из консоли (ssh) делать init 0 - тогда отправляется правильно.
Но если из иксов делать завершение - нет.
Что я сделал не так?

Содержание

Сообщения в этом обсуждении
"Как притормозить init 0?"
Отправлено XAnder , 02-Авг-16 08:27 
> Как бы так сделать, чтобы MTA (postfix) не завершался, пока мой скрипт
> не отработает?

Правильный вопрос будет такой: «Как бы так сделать, чтобы MTA (postfix) не завершался, пока не отправит моё письмо?»

Скрипт должен убедиться, что письмо действительно отправлено, прежде чем завершиться. Иначе никто не гарантирует, что Постфикс успеет его оправить в этой жизни.

Самое простое, что приходит в голову, — последить за очередью на отправку или логами Постфикса.


"Как притормозить init 0?"
Отправлено antoshkin , 02-Авг-16 09:09 
В скрипте у меня даже пауза есть, секунды 2-3. Это не меняет дела.
Как скрипт может влиять на init?? Фиолетово - убедился скрипт в отправке или нет, постфикс выключен и рабочая станция пошла в halt.
Тут надо как-то сказать init чтобы не завершал postfix (и всё, что для него требуется) до того, как выйдет скрипт.

"Как притормозить init 0?"
Отправлено ыы , 02-Авг-16 09:21 
> В скрипте у меня даже пауза есть, секунды 2-3. Это не меняет
> дела.
> Как скрипт может влиять на init?? Фиолетово - убедился скрипт в отправке
> или нет, постфикс выключен и рабочая станция пошла в halt.
> Тут надо как-то сказать init чтобы не завершал postfix (и всё, что
> для него требуется) до того, как выйдет скрипт.

Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.
К тому же, если вы станете ждать пока постфикс не отправит письмо, а письмо попадет в отложенную очередь (сразу не отправится), ребут может так никогда и не закончиться.


"Как притормозить init 0?"
Отправлено antoshkin , 02-Авг-16 11:11 
> Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.

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


"Как притормозить init 0?"
Отправлено ыы , 02-Авг-16 11:51 
>> Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.
> Полагаю, вы хотите предложить отправлять на сторонний смтп-релей?
> Я думал про это. Но оно неудобно по ряду причин.

Гхм... зачем вам  смтп-релей чтобы отправить письмо? Это элементарно делается прямо из скрипта. Либо прогой из шелл либо перл-скриптом.

https://www.yandex.ru/yandsearch?clid=9582&text=отправка%20письма%20из%20bash&l10n=ru&lr=20728&redircnt=1470127601.1

https://www.yandex.ru/search/?clid=9582&text=sendEmail%...

https://www.yandex.ru/search/?text=отправка%20письма%20perl&lr=20728&clid=9582


"Как притормозить init 0?"
Отправлено antoshkin , 02-Авг-16 12:23 
>>> Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.
>> Полагаю, вы хотите предложить отправлять на сторонний смтп-релей?
>> Я думал про это. Но оно неудобно по ряду причин.
> Гхм... зачем вам  смтп-релей чтобы отправить письмо? Это элементарно делается прямо
> из скрипта. Либо прогой из шелл либо перл-скриптом.
> https://www.yandex.ru/yandsearch?clid=9582&text=отправка%20письма%20из%20bash&l10n=ru&lr=20728&redircnt=1470127601.1
> https://www.yandex.ru/search/?clid=9582&text=sendEmail%...
> https://www.yandex.ru/search/?text=отправка%20письма%20perl&lr=20728&clid=9582

То что вы предлагаете - не что иное, как "отправка письма по смтп, как любой смтп клиент".
1. Зареги адрес в мэйлру или гмыле.
2. Включи там возможность отправить через смтп.
3. Узнай адрес смтп, порт, открой порты, установи емейл-клиента (как вы предлагаете sendEmail), OpenSSL и пр.
4. Еще потом трахайся с авторизацией полдня, следи, почему не отправляется и тп.

В таком случае лучше поднять во вне свой релей и прописать там нужные ИП, обратные зоные и тп.
Но и этим я не хочу заниматься, т.к. все равно "есть зависимость от стороннего сервиса".
"Прямо из скрипта", как вы говорите, я и отправляю:
echo "Some message@|/bin/mail -s subject some@address.com
Можно команде mail сказать, чтоб отправляла на тот самый релей. Но мне это неудобно.
Надо чтобы отправлялось сразу на сервер получателя по MX, однако mail этого делать не умеет.
Задача-то простая. Всего навсего притормозить секунды на 3 останов постфикса и сети.


"Как притормозить init 0?"
Отправлено ыы , 02-Авг-16 12:53 
>[оверквотинг удален]
>> Гхм... зачем вам  смтп-релей чтобы отправить письмо? Это элементарно делается прямо
>> из скрипта. Либо прогой из шелл либо перл-скриптом.
>> https://www.yandex.ru/yandsearch?clid=9582&text=отправка%20письма%20из%20bash&l10n=ru&lr=20728&redircnt=1470127601.1
>> https://www.yandex.ru/search/?clid=9582&text=sendEmail%...
>> https://www.yandex.ru/search/?text=отправка%20письма%20perl&lr=20728&clid=9582
>То что вы предлагаете - не что иное, как "отправка письма по смтп, как любой смтп клиент".
>1. Зареги адрес в мэйлру или гмыле.
>2. Включи там возможность отправить через смтп.
>3. Узнай адрес смтп, порт, открой порты, установи емейл-клиента (как вы предлагаете sendEmail), OpenSSL и пр.
>4. Еще потом трахайся с авторизацией полдня, следи, почему не отправляется и тп.

Зачем вы все это делаете? Ссылки которые я вам дал- как раз отправляют письмо сразу на почтовый сервер получателя.

> Надо чтобы отправлялось сразу на сервер получателя по MX, однако mail этого
> делать не умеет.

У меня перловый скрипт, отправляет "сразу на сервер получателя по MX". 10 строк кода. Ссылки я вам дал.

>Задача-то простая. Всего навсего притормозить секунды на 3 останов постфикса и сети.

https://www.yandex.ru/search/?text=service%20linux%20зависимость%20сервисов&lr=20728&clid=9582


"Как притормозить init 0?"
Отправлено antoshkin , 03-Авг-16 09:08 
> Зачем вы все это делаете? Ссылки которые я вам дал- как раз
> отправляют письмо сразу на почтовый сервер получателя.

1. Допустим, я напишу в скрипте отправку по смтп с помощью телнета напрямую по MX (в общем то же самое, что "ваш перловый скрипт"). Но init0-то идет, и его никто не останавливал!! причем одновременно и параллельно!! Вы это понимаете? Это значит, что в этот момент параллельно идет завершение не только постфикса, но и сети и прочих вещей, которые нужны для отработки такого скрипта.

2. Зависимость сервисов прописана. См. первый пост. Это не помогает.



"Как притормозить init 0?"
Отправлено ыы , 03-Авг-16 09:46 
>> Зачем вы все это делаете? Ссылки которые я вам дал- как раз
>> отправляют письмо сразу на почтовый сервер получателя.
> 1. Допустим, я напишу в скрипте отправку по смтп с помощью телнета
> напрямую по MX (в общем то же самое, что "ваш перловый
> скрипт"). Но init0-то идет, и его никто не останавливал!! причем одновременно
> и параллельно!! Вы это понимаете? Это значит, что в этот момент
> параллельно идет завершение не только постфикса, но и сети и прочих
> вещей, которые нужны для отработки такого скрипта.

Вот про сеть это правильная мысль. а про постфикс-нет. ведь он же не участвует в этом процессе.

> 2. Зависимость сервисов прописана. См. первый пост. Это не помогает.
>Даже в зависимостях я там поставил postfix (Required-Stop: postfix)

То есть  message должен подождать пока postfix не завершится? Наверное он так и делает.
Ждет пока постфикс не завершится, потом начинает отправлять через постфикс письмо...


Нужно в скриптах сеть, постфикс - поставить зависимость от message наверное...
и в скрипте сеть - поставить зависимость от постфикс...

Но постфикс завершается вне зависимости от того есть у него письма на оправку или нет.
И и тут мы возвращаемся к отправке письма без постфикса, а скриптом  напрямую из message.
В этом случае нужно проконтролировать только сеть -> "в скрипте сеть - поставить зависимость от message"


"Как притормозить init 0?"
Отправлено ыы , 03-Авг-16 09:58 
>[оверквотинг удален]
> так и делает.
> Ждет пока постфикс не завершится, потом начинает отправлять через постфикс письмо...
> Нужно в скриптах сеть, постфикс - поставить зависимость от message наверное...
> и в скрипте сеть - поставить зависимость от постфикс...
> Но постфикс завершается вне зависимости от того есть у него письма на
> оправку или нет.
> И и тут мы возвращаемся к отправке письма без постфикса, а скриптом
>  напрямую из message.
> В этом случае нужно проконтролировать только сеть -> "в скрипте сеть -
> поставить зависимость от message"

Хотя конечно, можно в скрипт message, в конце, поставить sleep 60 или sleep 600 и надеяться, что постфиксу хватит этого времени чтоб отправить почту.


"Как притормозить init 0?"
Отправлено antoshkin , 03-Авг-16 10:13 
> Хотя конечно, можно в скрипт message, в конце, поставить sleep 60 или
> sleep 600 и надеяться, что постфиксу хватит этого времени чтоб отправить
> почту.

Да не помогает sleep. У меня есть он в конце скрипта (sleep 5).
Пока этот скрипт работает (в фоне), в это время и постфикс и сеть уже завершаются, никого не спрашивая.


"Как притормозить init 0?"
Отправлено ыы , 03-Авг-16 10:29 
>> Хотя конечно, можно в скрипт message, в конце, поставить sleep 60 или
>> sleep 600 и надеяться, что постфиксу хватит этого времени чтоб отправить
>> почту.
> Да не помогает sleep. У меня есть он в конце скрипта (sleep
> 5).
> Пока этот скрипт работает (в фоне), в это время и постфикс и
> сеть уже завершаются, никого не спрашивая.

Это имеет смысл делать после того как настроена зависимость сервисов.


"Как притормозить init 0?"
Отправлено antoshkin , 04-Авг-16 05:55 
Написал телнет-сессию напрямую на MX из баш-скрипта.
Вообще теперь не отправляет (в течение init 0), т.к. сессия смтп длится намного дольше (пауза при helo, пауза при data, rcpt to, итп).
Если скрипт запустить руками - конечно всё отправляется красиво.

В общем вопрос остается открытым.


"Как притормозить init 0?"
Отправлено Square1 , 04-Авг-16 09:05 
> Написал телнет-сессию напрямую на MX из баш-скрипта.
> Вообще теперь не отправляет (в течение init 0), т.к. сессия смтп длится
> намного дольше (пауза при helo, пауза при data, rcpt to, итп).
> Если скрипт запустить руками - конечно всё отправляется красиво.
> В общем вопрос остается открытым.

http://www.opennet.me/openforum/vsluhforumID15/4323.html#13


"Как притормозить init 0?"
Отправлено XAnder , 02-Авг-16 12:20 
> Сделал скрипт, который при старте и остановке системы посылает письмо мне.
> Поместил его в init.d, сделал симлинки по науке для 3 и 5
> уровня: S50message, K01message (при запуске последним, при остановке - первым).

А для уровней 0 и 6 сделали? Какая у вас вообще система инициализации используется? Да и дистрибутив неплохо бы знать…


"Как притормозить init 0?"
Отправлено antoshkin , 02-Авг-16 12:24 
>> Сделал скрипт, который при старте и остановке системы посылает письмо мне.
>> Поместил его в init.d, сделал симлинки по науке для 3 и 5
>> уровня: S50message, K01message (при запуске последним, при остановке - первым).
> А для уровней 0 и 6 сделали? Какая у вас вообще система
> инициализации используется? Да и дистрибутив неплохо бы знать…

Для уровня 6 не нужно, а для 0 - там тоже криво: скрипт вызывается с параметром start.
И так же не срабатывает.

Дистрибутив - OpenSuse 11.04
Система sysV.


"Как притормозить init 0?"
Отправлено XAnder , 02-Авг-16 12:48 
> Для уровня 6 не нужно, а для 0 - там тоже криво:
> скрипт вызывается с параметром start.
> И так же не срабатывает.
> Дистрибутив - OpenSuse 11.04
> Система sysV.

Интересно. Я, конечно, дебианщик, с openSUSE дел не имел. Правильно ли я понял, что у вас есть ссылка /etc/rc0.d/K01message, и при выключении (т. е. переходе на уровень 0) системы скрипт по этой ссылке почему-то запускается с аргументом start?

И почему для уровня 6 не нужно? У вас никогда не бывает перезагрузки?


"Как притормозить init 0?"
Отправлено XAnder , 02-Авг-16 13:28 
>[оверквотинг удален]
>> скрипт вызывается с параметром start.
>> И так же не срабатывает.
>> Дистрибутив - OpenSuse 11.04
>> Система sysV.
> Интересно. Я, конечно, дебианщик, с openSUSE дел не имел. Правильно ли я
> понял, что у вас есть ссылка /etc/rc0.d/K01message, и при выключении (т.
> е. переходе на уровень 0) системы скрипт по этой ссылке почему-то
> запускается с аргументом start?
> И почему для уровня 6 не нужно? У вас никогда не бывает
> перезагрузки?

Ага, понял, в Сусе сделано не так, как в Дебиане. rc0.d и rc6.d здесь, похоже, не нужны.


"Как притормозить init 0?"
Отправлено antoshkin , 05-Авг-16 06:47 
Еще нюанс.
Компьютер берет сеть по вайфай посредством NetworkManager в иксах.
В итоге, когда комп выключается, (я притормозил постфикс в его init скрипте), видимо сеть отключается быстрее всего, и постфикс ругается на то, что не может найти домен получателя.
Досылает письмо при следующем включении компа.
В общем кривовато.

"Как притормозить init 0?"
Отправлено Ingoa , 08-Авг-16 18:54 
> Еще нюанс.
> Компьютер берет сеть по вайфай посредством NetworkManager в иксах.
> В итоге, когда комп выключается, (я притормозил постфикс в его init скрипте),
> видимо сеть отключается быстрее всего, и постфикс ругается на то, что
> не может найти домен получателя.
> Досылает письмо при следующем включении компа.
> В общем кривовато.

Может проще будет просто мониторить каким-нить nagios какой-нить сервис вашего компа? А там по событиям писать письма, смс-сить, кормить кота?


"Как притормозить init 0?"
Отправлено Пр0х0жий , 15-Ноя-16 17:29 
> Поместил его в init.d, сделал симлинки по науке для 3 и 5
> уровня: S50message, K01message (при запуске последним, при остановке - первым).
> ...
> он отправляет, но MTA его отправляет только в следующий раз после
> включения.

sysvinit:
Если lock-файл в /var/lock/subsys не существует, разрешён старт сервиса.
Если lock-файл в /var/lock/subsys существует, разрешён стоп сервиса.
lock-файл: пустой файл с именем сервиса.

Можно также заглянуть в /etc/init.d/functions