Eugene Berdnikov <b...@protva.ru> 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 ---

Ответить