Процессы incrond со сценарием оболочки завершаются, только если код завершения сценария равен 1?
конфигурация
У меня 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 должен был быть остановлен, поскольку он выполнил свою работу. По умолчанию было 2 процесса в systemctl status incrond
, поэтому ожидаемый результат команды:
/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>
Это насколько я могу проверить. Я не знаю, как разобраться в этом дальше.
Исправление
Если вместо обычного выхода я 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 ответ
Похоже, это является частью более крупной проблемы с incron 0.5.12 ( incron / Issues / 52, Incron / Issues / 53)