Определение версии упакованного процесса на Linux

Чтения вызовут трафик. статистика файла () вызовы вызовет трафик. У клиентов есть кэш, но это является очень недолгим и является действительно не чем-то, на что можно полагаться.

Никакой когда-либо обвиняемый NFS того, чтобы быть быстрым и эффективным, хотя это может быть настроено.

0
задан 4 May 2012 в 18:25
5 ответов

Вы можете проверить наличие / 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

Я также хотел бы указать, что это не делает в точности того, что вы искали, так как пока оно обнаружит процесс без исполняемого файла, поддерживаемого носителем, он не предоставит вам какая конкретная версия может быть у этого процесса.

3
ответ дан 4 December 2019 в 11:02

Вы можете сделать это с помощью Puppet ... Укажите (потребуйте) конкретную версию пакета и перезапустите службу для соответствия. То же самое возможно и с другими зависимостями вашего пакета.

3
ответ дан 4 December 2019 в 11:02

Попробуй:

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 .

1
ответ дан 4 December 2019 в 11:02

Когда исполняемый файл находится в памяти, его версия в файловой системе может отличаться. Так нет.

0
ответ дан 4 December 2019 в 11:02

Я полагаю, вы ищете нечто похожее на инструмент checkrestart , который является частью пакета debian-goodies . Он в основном использует просмотры всех запущенных процессов и определяет, относятся ли они к удаленным файлам. Затем он сопоставляет это с именами пакетов, ища файлы в базе данных пакетов. Затем он сообщает вам, какие службы необходимо перезапустить.

Если вы не используете дистрибутив на основе Debian, то я подозреваю, что вы можете загрузить исходный код (python) и попытаться адаптировать инструмент к своей среде. Или вы можете просто выяснить, что он делает, и напрямую вызвать lsof.

Вот версия, которую кто-то создал для Gentoo.

3
ответ дан 4 December 2019 в 11:02

Теги

Похожие вопросы