Re: devuan

2023-09-28 Пенетрантность Andrey Jr. Melnikov
Eugene Berdnikov  wrote:
> On Thu, Sep 28, 2023 at 05:32:35PM +0700, Max Nikulin wrote:
> > On 26/09/2023 21:43, Eugene Berdnikov wrote:
> > > On Tue, Sep 12, 2023 at 10:55:46PM +0300, Eugene Berdnikov wrote:
> > >   Но не тут-то было: сегодня 4 раза подряд rsyslogd не запустился... :)
> > >   На том же хосте, где 2 недели назад проверялся orphan-sysvinit-scripts.
> > 
> > А в консоль он что-нибудь пишет, когда не может запуститься?

>  Нет.

> > Останавливается перед этим нормально?

>  Ммм... не знаю. Он при остановке что-то странное делает.
>  У него при работе открыт некий сокет на fd=1,

> lr-x-- 1 root root 64 сен 28 16:30 0 -> /dev/urandom
> lrwx-- 1 root root 64 сен 28 16:30 1 -> 'socket:[34753352]'
> ...

>  и он перед экзитом выполняет такой код:

> [pid   848] --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1428154, 
> si_uid=0} ---
> [pid   848] gettid()= 848
> [pid   848] getpid()= 848
> ...
> [pid   848] kill(848, SIGTTOU)  = 0
> [pid   848] --- SIGTTOU {si_signo=SIGTTOU, si_code=SI_USER, si_pid=848, 
> si_uid=0} ---
> [pid   848] sigreturn({mask=[]})= 0
> [pid   848] send(1, "<46>Sep 28 16:37:26 rsyslogd: [origin 
> software=\"rsyslogd\" swVersion=\"8.2308.0\" x-pid=\"848\" 
> x-info=\"https://www.rsyslog.com\;] exiting on signal 15.", 146, 
> MSG_NOSIGNAL) = -1 ECONNREFUSED (В соединении отказано)
> [pid   848] close(1)= 0
> [pid   848] socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 1
> [pid   848] connect(1, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = -1 
> ENOENT (Нет такого файла или каталога)
> [pid   848] close(1)= 0

Это стандартный кусок записи внутреннего сообщения в лог. Ничего интересного
тут нет. Самое интересное - почему сдох слушатель, но этого в трейсе у тебя
нет.

>  Возможно, этот сокет с fd=1 используется для взаимодействия со своими же
Это явно результат вызова openlog() где-то внутри syslog().

>  тредами, но поскольку на send() возвращается ECONNREFUSED, то скорее всего
>  тред-писатель уже не слушает, и потому в логе сообщения об экзите нет.
>  Зачем далее открывается ещё один сокет, и делается попытка соединиться
>  с /dev/log (это самим-то rsyslogd, да ещё по получении SIGTERM!),
>  я не понимаю. И, честно говоря, совершенно не горю желанием разбираться,
>  поскольку, повторюсь, страшно подумать, что там внутри...

>  Хотя может я просто чайник и не способен понять логику из трейса.
>  Например, зачем самому себе посылать SIGTTOU, причём внутри обработчика
>  сигнала (поскольку далее идёт sigreturn()).
Зачем - это можно понять из коментария пустого обработчика сигнала:

--- cut ---
static void
hdlr_sigttin_ou(void)
{
/* this is just a dummy to care for our sigttin input
 * module cancel interface and sigttou internal message
 * notificaton/mainloop wakeup mechanism. The important
 * point is that it actually does *NOTHING*.
 */
}
--- cut ---



Re: devuan

2023-09-28 Пенетрантность Andrey Jr. Melnikov
Max Nikulin  wrote:
> On 26/09/2023 14:19, Andrey Jr. Melnikov wrote:
> > Max Nikulin wrote:
> >
> >> https://manpages.debian.org/bookworm/sysvinit-core/init.8.en.html#CHANGING_RUNLEVELS
> >> я перестал понимать, куда его дальше-то расширять? Вроде наоборот хотят
> >> сузить, выкинув /etc/powerstatus, по которому определяется, какой из 3
> >> скриптов запускать по SIGPWR
> > Даа, читал ты его явно по диагонали.

> Тем не менее единственное новое, что я увидел в пересказе, - это 
> /var/run/powerstatus, что не особенно принципиально (из разряда мелочь, 
> но приятно).

> >>> L(OW)
> >>>  The power is failing and the UPS has a low battery. Execute the
> >>>  powerfailnow entries.
> >> Я не в восторге от такого решения, но и предлагавшиеся 3 сигнала, с моей
> >> точки зрения, не лучше.
> > Т.е. с твоей точки зраения один signal(1, SIGRTMIN+x) хуже чем вся эта
> > пляска вокруг файликов с сигналами и FIFO?

> Я думаю, мы ни до чего не договоримся, да и не важно, ведь ни на что это 
> не повлияет.
А чего тогда разговаривать...

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

> Я думаю, что когда люди выбрали один SIGPWR + /etc/powerstatus, они 
> рассматривали 3 сигнала и остановились на варианте, который сейчас 
> выглядит несколько вычурным.
Когда они его выбирали - про SIGRTMIN ещё даже никто и не думал. SIGRTMIN
появится только в POSIX 1003.1b а это 1993 год. Собственно по этому там
такой изощрённый мультиплексор с файликом - сигнал один, а передать
состоняие надо больше чем одно.

> Послать-то сигнал может и просто, а вот правильно поймать уже некоторое 
> искусство. Чинить обработчики сигналов - трудоемкий процесс. За это я 
> сигналы не люблю.
Вот и не надо перекладывать свои "люблю-нелюблю" на всех. Сигналы -
хорошее, правильное асинхронное средство донести до процесса необходимую
информацию. 

> С сокетами проще. Если есть утилита и библиотека, которые могут слать 
> нужные сообщения, и процесс их может правильно обработать, то это лучше, 
> чем сигналы. Мне такой вариант нравится больше.
Проще? Создать сокет, открыть сокет, крутить select() в цикле, обрабатывать
ошибки, прочитать сокет (если прочитается), закрыть сокет.. и это все вместо 
одного signal handler?

Нее, всё, больше с тобой разговривать не о чем, если ты совершенно не
понимаешь условия задачи. Ты можешь во все запускаемые скрипты добавлять
опрос ups - если тебе так удобно. Но мне - удобнее иметь три отдельных
сигнала, три отдельных точки запуска - в которых в зависиомости от типа UPS
будут или не будут отключатся сетевы интерфесы, система будет уходить в
suspend-to-disk или полный power-off.



Re: devuan

2023-09-28 Пенетрантность Eugene Berdnikov
On Thu, Sep 28, 2023 at 05:32:35PM +0700, Max Nikulin wrote:
> On 26/09/2023 21:43, Eugene Berdnikov wrote:
> > On Tue, Sep 12, 2023 at 10:55:46PM +0300, Eugene Berdnikov wrote:
> >   Но не тут-то было: сегодня 4 раза подряд rsyslogd не запустился... :)
> >   На том же хосте, где 2 недели назад проверялся orphan-sysvinit-scripts.
> 
> А в консоль он что-нибудь пишет, когда не может запуститься?

 Нет.

> Останавливается перед этим нормально?

 Ммм... не знаю. Он при остановке что-то странное делает.
 У него при работе открыт некий сокет на fd=1,

lr-x-- 1 root root 64 сен 28 16:30 0 -> /dev/urandom
lrwx-- 1 root root 64 сен 28 16:30 1 -> 'socket:[34753352]'
...

 и он перед экзитом выполняет такой код:

[pid   848] --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1428154, 
si_uid=0} ---
[pid   848] gettid()= 848
[pid   848] getpid()= 848
...
[pid   848] kill(848, SIGTTOU)  = 0
[pid   848] --- SIGTTOU {si_signo=SIGTTOU, si_code=SI_USER, si_pid=848, 
si_uid=0} ---
[pid   848] sigreturn({mask=[]})= 0
[pid   848] send(1, "<46>Sep 28 16:37:26 rsyslogd: [origin 
software=\"rsyslogd\" swVersion=\"8.2308.0\" x-pid=\"848\" 
x-info=\"https://www.rsyslog.com\;] exiting on signal 15.", 146, MSG_NOSIGNAL) 
= -1 ECONNREFUSED (В соединении отказано)
[pid   848] close(1)= 0
[pid   848] socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 1
[pid   848] connect(1, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = -1 
ENOENT (Нет такого файла или каталога)
[pid   848] close(1)= 0

 Возможно, этот сокет с fd=1 используется для взаимодействия со своими же
 тредами, но поскольку на send() возвращается ECONNREFUSED, то скорее всего
 тред-писатель уже не слушает, и потому в логе сообщения об экзите нет.
 Зачем далее открывается ещё один сокет, и делается попытка соединиться
 с /dev/log (это самим-то rsyslogd, да ещё по получении SIGTERM!),
 я не понимаю. И, честно говоря, совершенно не горю желанием разбираться,
 поскольку, повторюсь, страшно подумать, что там внутри...

 Хотя может я просто чайник и не способен понять логику из трейса.
 Например, зачем самому себе посылать SIGTTOU, причём внутри обработчика
 сигнала (поскольку далее идёт sigreturn()).

> > > В чём была проблема -- мне тогда
> > >   докопаться не удалось (уже не помню, почему, кажется, под strace эта
> > >   зараза всегда успешно работала, а без strace процесс исчезал, не 
> > > оставляя
> > >   ни корки, ни других следов).
> 
> Либо не крэш, либо не может запись core файла подавлена. Как минимум 2 места
> есть: rlimits и sysctl kernel.core*, описано в core(5).

# sysctl -a | fgrep kernel.core
kernel.core_pattern = core
kernel.core_pipe_limit = 0
kernel.core_uses_pid = 0

# ulimit -c
unlimited

# limit coredumpsize
coredumpsizeunlimited

 Перезапускаем (/etc/init.d/rsyslog restart) и ура, с первого раза поймали.

# ps -C rsyslogd fww
PID TTY  STAT   TIME COMMAND
#

# ls -al core
ls: невозможно получить доступ к 'core': Нет такого файла или каталога

# find / -mount -name core
#

 А пока я всё это копипастил сюда, запускаемый по крону монитор отловил
 факт отсутствия процесса и запустил его:

# ps -C rsyslogd fww
PID TTY  STAT   TIME COMMAND
1053061 ?Ssl0:00 /usr/sbin/rsyslogd

 Кстати, с тех пор как я писал сюда об "успешных" экспериментах по запуску
 rsyslogd, тот опять обновился, и нынче его версия 8.2308.0-1, для i386.
-- 
 Eugene Berdnikov



Re: devuan

2023-09-28 Пенетрантность Max Nikulin

On 26/09/2023 21:43, Eugene Berdnikov wrote:

On Tue, Sep 12, 2023 at 10:55:46PM +0300, Eugene Berdnikov wrote:
  Но не тут-то было: сегодня 4 раза подряд rsyslogd не запустился... :)
  На том же хосте, где 2 недели назад проверялся orphan-sysvinit-scripts.


А в консоль он что-нибудь пишет, когда не может запуститься? 
Останавливается перед этим нормально?



В чём была проблема -- мне тогда
  докопаться не удалось (уже не помню, почему, кажется, под strace эта
  зараза всегда успешно работала, а без strace процесс исчезал, не оставляя
  ни корки, ни других следов).


Либо не крэш, либо не может запись core файла подавлена. Как минимум 2 
места есть: rlimits и sysctl kernel.core*, описано в core(5).