Чтения вызовут трафик. статистика файла () вызовы вызовет трафик. У клиентов есть кэш, но это является очень недолгим и является действительно не чем-то, на что можно полагаться.
Никакой когда-либо обвиняемый NFS того, чтобы быть быстрым и эффективным, хотя это может быть настроено.
Вы можете проверить наличие / proc / [pid] / exe , и если он существует, вы знаете, что процесс выполняет правильную версию.
Если исходный файл, на который указывает exe, был перезаписан / proc / [pid] / exe становится мертвой ссылкой.
Если вы знаете , что вы ищете, это, вероятно, самый надежный способ вы можете использовать для получения данных. Если вы не знаете, что ищете (просто ищите, скажем, для всех pid, которые не имеют исполняемого файла с поддержкой носителя), вам придется использовать некоторую эвристику, чтобы попытаться выяснить исходный путь выполнения процесса на основе его заданного $ 0 имя (которое может быть изменено процессом во время выполнения). Я предполагаю, что это то, что делает предложение @Zoredache о checkrestart.
Насколько я знаю (и как я ' проверено) такое поведение / proc / [pid] / exe всегда верно - даже если новое имя файла в том же пути, что и старое имя файла. / proc / [pid] / exe всегда становится неработающей ссылкой, когда исходная копия отсутствует.
Что хорошо, так это то, что он должен быть неоднозначным, поскольку он не полагается на диспетчер пакетов, а способ поведения ядра ...
#!/bin/sh
if [ -z "$1" ]; then
echo "Specify a process-id" >&2
else
PID=$1;
fi
PATH=$(readlink /proc/${PID}/exe);
if [ $? -ne 0 ]; then
echo "No path for this process! Process is likely running an old copy!" >&2
else
echo "Points back to ${PATH} and is running the latest copy"
fi
Я также хотел бы указать, что это не делает в точности того, что вы искали, так как пока оно обнаружит процесс без исполняемого файла, поддерживаемого носителем, он не предоставит вам какая конкретная версия может быть у этого процесса.
Вы можете сделать это с помощью Puppet ... Укажите (потребуйте) конкретную версию пакета и перезапустите службу для соответствия. То же самое возможно и с другими зависимостями вашего пакета.
Попробуй:
DAEMON=mysqld
WIGGLEROOM=10
ITIME=$(/bin/rpm --queryformat '%{INSTALLTIME}\n' -qf /etc/init.d/$DAEMON)
STIME=$(/usr/bin/stat -c %Y /proc/$(/sbin/pidof -s $DAEMON))
if [ -z "$ITIME" -o -z "$STIME" ]; then
echo Status unknown.
exit -1
fi
if [ $(($ITIME-$STIME)) -gt $WIGGLEROOM -o $(($STIME-$ITIME)) -gt $WIGGLEROOM ]; then
echo Service not restarted.
exit 1
fi
exit 0
Просто придумал, так что не суди меня слишком строго, если есть очевидная ошибка, но я немного протестировал ее, и она, похоже, у меня работает.
Она завершается без ошибок, если время установки пакета и перезапуск службы находятся в пределах дельты $ WIGGLEROOM
; в других случаях выдает ошибку. В зависимости от демона вам может потребоваться более хитрая логика, чем простая логика, которую я использую для pidof
и /etc/init.d/$DAEMON
; в частности, Apache потребует некоторой доработки, но этого достаточно, по крайней мере, для начала, и для меня он работает для mysqld
.
Когда исполняемый файл находится в памяти, его версия в файловой системе может отличаться. Так нет.
Я полагаю, вы ищете нечто похожее на инструмент checkrestart
, который является частью пакета debian-goodies . Он в основном использует просмотры всех запущенных процессов и определяет, относятся ли они к удаленным файлам. Затем он сопоставляет это с именами пакетов, ища файлы в базе данных пакетов. Затем он сообщает вам, какие службы необходимо перезапустить.
Если вы не используете дистрибутив на основе Debian, то я подозреваю, что вы можете загрузить исходный код (python) и попытаться адаптировать инструмент к своей среде. Или вы можете просто выяснить, что он делает, и напрямую вызвать lsof.
Вот версия, которую кто-то создал для Gentoo.