«Сторожевой таймер» для приложений

Возникла проблема с тем, что иногда LibreOffice повисает. Например при попытке конвертации из формата PDF. При этом он начинает есть 100% ресурсов одного ядра, и пока не остановишь сервер ничего не помогает. Попытка обратиться с багом в сообщество привела к ответу о том, что мы не поддерживаем этот формат и свободен. Печально, но как-то надо выкрутиться.

Идея в общем появилась такая — при начале выполнении скрипта в отдельный каталог помещаем файл с идентификатором конвертации, и в случае успешной конвертации удаляем его. Главное чтобы конверация завершилась до тайм-аута.
Затем через Cron проверяем есть ли этот файл, скажем минуты через 3, если есть — то считаем что LibreOffice повис и его необходимо перезапустить.

#!/bin/sh

#Задаем переменную директории
DIR=/var/www/html/libreoffice

while true
do
case `find $DIR -type f -mmin +3 | wc -l` in
0 )
exit
;; #можно добавить свои команды
* )
date >> /var/www/html/restart.txt
find $DIR -type f -mmin +1 >> /var/www/html/restart.txt
rm /var/www/html/libreoffice/*
killall soffice.bin;
sleep 5;
/usr/bin/unoconv --listener &
exit
;; #конец скрипта
esac
done
exit 0

В файл лога /var/www/html/restart.txt запишется время и идентификатор «ошибочных» конвертаций. Затем можно проанализировать ситуацию и больше не допускать её. Например, гораздо логичнее запретить конвертировать файлы формата PDF в LibreOffice.

Но я бы все-таки рекомендовал оставить данную защиту, ибо файлов миллионы — и мало ли на чем зависнет LibreOffice.

Прокрутить вверх