Процессы incrond со скриптом оболочки завершаются, только если код завершения скрипта равен 1 - PullRequest
0 голосов
/ 11 декабря 2018

Конфигурация

У меня incrond 0.5.12 в CentOS 7.6, настроенный следующим образом в /etc/incron.d/example:

/var/tmp/dir IN_CREATE sh /root/incron_script.sh $@/$#

Мой /root/incron_script.sh просто содержит следующее: echo "$@" >> /tmp/incrond_log.log

Это означает, что когда я создаю файл в var/tmp/dir, полный путь к файлу добавляется к /tmp/incrond_log.log.Вот и все.

Определение проблемы

В основном проблема заключается в том, что если incrond настроен для вызова сценария оболочки, процессы создаются и не останавливаются, пока этот сценарий оболочки не завершится с чем-то другим.чем 0. Я смотрю на результат systemctl status incrond (или ps aux | grep ..., то же самое).

Итак, ниже, например, есть 2 созданных процесса.

[root@server ~]# systemctl status incrond
● incrond.service - Inotify System Scheduler
   Loaded: loaded (/usr/lib/systemd/system/incrond.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-12-11 13:39:55 +03; 11min ago
  Process: 16746 ExecStart=/usr/sbin/incrond (code=exited, status=0/SUCCESS)
 Main PID: 16747 (incrond)
    Tasks: 498
   Memory: 5.9M
   CGroup: /system.slice/incrond.service
           ├─13687 /usr/sbin/incrond
           ├─13747 /usr/sbin/incrond

Тестирование

Мы создаем 5 файлов, проверяем, были ли их имена добавлены в журнал (работает incrond), и проверяем, сколько процессов запускается.

mkdir -p /var/tmp/dir
rm -f /var/tmp/dir/*
echo -n > /tmp/incrond_log.log
systemctl restart incrond
for i in $(seq 1 5);
do
    touch /var/tmp/dir/a$i.txt
    sleep 0.5
    tail -n1 /tmp/incrond_log.log
    systemctl status incrond | grep /usr/sbin/incrond | wc -l
done

Ожидаемый результат

Я бы ожидал, что incrond раскроет процесс для каждого файла, созданного в этом каталоге, но завершит работу сразу после этого, так как на самом деле делать особо нечего.Если журнал показывает, что путь к файлу находится в файле журнала, это означает, что процесс incrond должен был быть остановлен, поскольку он выполнил свою работу.По умолчанию в systemctl status incrond было 2 процесса, поэтому ожидаемый результат команды:

/var/tmp/dir/a1.txt
2
/var/tmp/dir/a2.txt
2
/var/tmp/dir/a3.txt
2
/var/tmp/dir/a4.txt
2
/var/tmp/dir/a5.txt
2

Фактический результат

Фактический результат:

/var/tmp/dir/a1.txt
3
/var/tmp/dir/a2.txt
4
/var/tmp/dir/a3.txt
5
/var/tmp/dir/a4.txt
6
/var/tmp/dir/a5.txt
7

Диагноз

Проблема проявляется в процессах зомби:

root      1540  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      1551  0.0  0.0  12784   672 ?        S    19:49   0:00 /usr/sbin/incrond
root      1553  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      1566  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      1576  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      2339  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      2348  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      2351  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      2355  0.0  0.0  12784   224 ?        S    19:49   0:00 /usr/sbin/incrond
root      5471  0.0  0.0      0     0 ?        Z    19:17   0:00 [incrond] <defunct>
root      5480  0.0  0.0      0     0 ?        Z    19:17   0:00 [incrond] <defunct>
root      5483  0.0  0.0      0     0 ?        Z    19:17   0:00 [incrond] <defunct>
root      5561  0.0  0.0      0     0 ?        Z    19:17   0:00 [incrond] <defunct>
root      8012  0.0  0.0      0     0 ?        Z    19:12   0:00 [incrond] <defunct>
root      8023  0.0  0.0      0     0 ?        Z    19:12   0:00 [incrond] <defunct>
root      8025  0.0  0.0      0     0 ?        Z    19:12   0:00 [incrond] <defunct>
root      8148  0.0  0.0      0     0 ?        Z    19:12   0:00 [incrond] <defunct>

Это насколько я могу проверить.Я не знаю, как разобраться в этом подробнее.

Исправление

Если вместо обычного выхода I exit 1, процессы завершаются правильно.Так что мой /root/incron_script становится: echo "$@" >> /tmp/incrond_log.log && exit 1.Мой статус теперь выглядит следующим образом:

[root@server ~]# systemctl status incrond
● incrond.service - Inotify System Scheduler
   Loaded: loaded (/usr/lib/systemd/system/incrond.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-12-11 14:09:04 +03; 16s ago
  Process: 7882 ExecStart=/usr/sbin/incrond (code=exited, status=0/SUCCESS)
 Main PID: 7888 (incrond)
    Tasks: 6
   Memory: 220.0K
   CGroup: /system.slice/incrond.service
           └─7888 /usr/sbin/incrond

Dec 11 14:09:09 server.example.com incrond[7888]: PATH (/var/tmp/dir) FILE (a1.txt) EVENT (IN_CREATE)
Dec 11 14:09:09 server.example.com incrond[7888]: (system::example) CMD (sh /root/incron_script.sh /var/tmp/dir/a1.txt )
Dec 11 14:09:10 server.example.com incrond[7888]: PATH (/var/tmp/dir) FILE (a2.txt) EVENT (IN_CREATE)
Dec 11 14:09:10 server.example.com incrond[7888]: (system::example) CMD (sh /root/incron_script.sh /var/tmp/dir/a2.txt )
Dec 11 14:09:10 server.example.com incrond[7888]: PATH (/var/tmp/dir) FILE (a3.txt) EVENT (IN_CREATE)
Dec 11 14:09:10 server.example.com incrond[7888]: (system::example) CMD (sh /root/incron_script.sh /var/tmp/dir/a3.txt )
Dec 11 14:09:11 server.example.com incrond[7888]: PATH (/var/tmp/dir) FILE (a4.txt) EVENT (IN_CREATE)
Dec 11 14:09:11 server.example.com incrond[7888]: (system::example) CMD (sh /root/incron_script.sh /var/tmp/dir/a4.txt )
Dec 11 14:09:11 server.example.com incrond[7888]: PATH (/var/tmp/dir) FILE (a5.txt) EVENT (IN_CREATE)
Dec 11 14:09:11 server.example.com incrond[7888]: (system::example) CMD (sh /root/incron_script.sh /var/tmp/dir/a5.txt )

Вопрос

Так это ожидаемое поведение тогда?Почему выход 0 поддерживает процесс, а выход 1 - нет?Где это задокументировано?Любые предложения о том, как я могу отладить это дальше?

Обновления

  • 2018-12-12: добавлена ​​диагностика (темы зомби)

1 Ответ

0 голосов
/ 28 декабря 2018

Похоже, что это является частью более крупной проблемы с incron 0.5.12 ( incron / эмитентов / 52 , incron / эмитентов / 53 )

...