Легко узнать, какая версия пакета установлена в дистрибутиве Linux:
package-manager info <packagename>
то есть:
yum info ntp
Однако существует ли способ узнать, что такое «соглашение Linux» пакетная версия запущенного процесса является?
Возможная ситуация состоит в том, что простая установка пакета не является гарантией того, что запущенный им процесс будет остановлен и перезапущен (это общепринятое соглашение, но не гарантия!). Итак, мне любопытно, есть ли способ узнать версию процесса ... которая не обязательно является версией установленного пакета, который сделал процесс доступным.
Я считаю, что вы ищете что-то похожее на checkrestart
инструмент, который является частью дебиан-вкусности пакет. Он в основном использует просмотры всех запущенных процессов и определяет, относятся ли они к удаленным файлам. Затем он сопоставляет это с именами пакетов, ища файлы в базе данных пакетов. Затем он сообщает вам, какие службы необходимо перезапустить.
Если вы не используете дистрибутив на основе Debian, я подозреваю, что вы можете загрузить исходный код (python) и попытаться адаптировать инструмент к своей среде. Или вы можете просто выяснить, что он делает, и напрямую вызвать lsof.
Вот версия кто-нибудь создан для Gentoo.
Вы можете сделать это с помощью Puppet ... Укажите (потребуйте) конкретную версию пакета и перезапустите службу для соответствия. То же самое возможно и с другими зависимостями вашего пакета.
Вы можете проверить наличие / 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
Я также хотел бы отметить, что это не так именно то, что вы искали, поскольку, пока он обнаружит процесс без его исполняемого файла на носителе, он не предоставит вам, какой конкретной версией может быть этот процесс.
Попробуйте:
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
для меня.
Когда исполняемый файл находится в памяти, его версия в файловой системе может отличаться. Так что нет.