Как из командной строки определить, требуется ли перезагрузка компьютера?


256

Когда вы устанавливаете определенные обновления (например, новое ядро) в Ubuntu Desktop, вы получаете указание на необходимость перезагрузки (в Lucid значок выхода из системы становится красным).

Как я могу проверить из командной строки, требуется ли перезагрузка сервера Ubuntu ?

Я мог /etc/motdбы найти « Требуется перезагрузка системы» , но мне бы хотелось более элегантное решение. Кроме того, я хочу решение, которое работает в более старых версиях, например, Hardy (8,04 LTS).


Если вы поддерживаете сервер, у вас также скоро появится ощущение, что обновление или обновление не требуют перезагрузки. Большинство обновлений не требует перезапуска или только перезапуска службы (что должно происходить автоматически).
eXlin

Ответы:


289

Вы можете просто проверить, существует ли файл /var/run/reboot-requiredили нет.

Например, любой из них скажет вам «нет такого файла» или «файл не найден», если вам не нужно перезагружаться, в противном случае (если вам нужно перезагружаться) файл будет существовать, и эти команды будут отображать информацию о файле:

file /var/run/reboot-required
stat /var/run/reboot-required
ls /var/run/reboot-required

В скрипте bash вы можете использовать:

#!/bin/bash
if [ -f /var/run/reboot-required ]; then
  echo 'reboot required'
fi

1
Это работает, и это работает на Харди тоже. (Не работает на Dapper - 6.06 - который у меня все еще есть на одной машине. Трудно.) Кстати, файл / var / run / reboot-required создается / usr / share / update-notifier / notify-reboot -required, который вызывается из сценариев сопровождающих различных пакетов.
Мариус Гедминас

2
Он бы работал и на Dapper, если бы я установил пакет update-notifier, за исключением того, что он хочет перенести вещи GNOME на 120 мегабайт на мой древний сервер.
Мариус Гедминас

10
Лучше установить update-notifier-common, он не зависит от каких-либо графических элементов (но не существует для Dapper).
Мариус Гедминас

1
FWIW, update-notifier-common не установлен на сервере Lucid по умолчанию.
Мариус Гедминас

5
Спасибо! и файл /var/run/reboot-required.pkgsперечислит пакеты, которые требуют перезагрузки.
nealmcb

44

В пакете debian-goodies есть команда с именем, checkrestartкоторая весьма полезна. Его вывод может помочь вам избежать полной перезагрузки.

Он сообщает, какие запущенные приложения загрузили разделяемые библиотеки, которые были обновлены во время работы приложения. Затем вы перезапускаете приложения и службы вручную и избегаете полной перезагрузки. Не помогает с обновлениями ядра, хотя.


1
Как это может заставить меня избежать полной перезагрузки?
Oxwivi

11
Он сообщает, какие запущенные приложения загрузили разделяемые библиотеки, которые были обновлены во время работы приложения. Затем вы перезапускаете приложения и службы вручную и избегаете полной перезагрузки. Не помогает с обновлениями ядра, хотя.
Аквахерд

Это должен быть главный ответ. Очень полезно. OpenSUSE получил встроенный инструмент (а также поможет вам как его запустить). Позор Ubuntu просто идет "перезагрузка, перезагрузка". Например, colord требуется перезагрузка здесь. Следовательно, нет необходимости перезагружать.
Apache

@aquaherd Очень полезный комментарий - возможно, стоит перенести это в свой ответ?
Дункан Джонс

33

Обычно если файл

/var/run/reboot-required 

существует, вы должны перезагрузить. Вы можете увидеть, есть ли этот файл, используя эту простую команду в gnome-terminal.

ls /var/run/reboot-required

Этот файл, кажется, больше не создается из-общего-обновления-уведомления, который использовал для его создания.
Скотт

17

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

На этом скриншоте 199!внизу строки с красным фоном видно, что доступно 199 обновлений. Это !! означает, что некоторые обновления безопасности . Меню на переднем плане выбирает, какие уведомления о состоянии должны отображаться.

Если требуется перезагрузка, это будет обозначено символом, (R)отображаемым в нижней строке с белым текстом на синем фоне. Более подробную информацию и другие показатели можно прочитать на странице руководства byobu .

Скриншот


9

/etc/motdФайл получает информацию о том, требуется ли перезагрузка из /var/run/reboot-requiredфайла.

Вы можете проверить содержимое этого файла в терминале с помощью cat /etc/motdкоманды


update-notifier-common используется для создания этого, но больше не используется
Скотт,

8

Если у вас установлены пакеты reboot-notifier или update-notifier-common, вы получите файлы / var / run / reboot-required и /var/run/reboot-required.pkgs

reboot-notifier является более новым в Ubuntu Wily и Xenial. Debian растягивается, но в jessie-backports

update-notifier-common Устаревший, во всех версиях Ubuntu, включая Xenial и Debian Wheezy. Не в Debian Stretch или Джесси.

(Существует некоторая предыстория для пакета reboot-notifier по адресу https://feeding.cloud.geek.nz/posts/introduction-reboot-notifier/ )

Если эти пакеты не установлены, вы можете сравнить версию установленного пакета linux с запущенной версией:

tim@tramp:~$ dpkg -l linux-image-*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                              Version               Architecture          Description
+++-=================================-=====================-=====================-=======================================================================
ii  linux-image-3.16.0-4-amd64        3.16.7-ckt20-1+deb8u4 amd64                 Linux 3.16 for 64-bit PCs
ii  linux-image-amd64                 3.16+63               amd64                 Linux for 64-bit PCs (meta-package)
tim@tramp:~$ more /proc/version
Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian <b>3.16.7-ckt20-1+deb8u3</b> (2016-01-17)

Здесь вы можете увидеть, что последнее установленное ядро ​​- 3.16.7-ckt20-1 + deb8u4, но работает ядро ​​3.16.7-ckt20-1 + deb8u3. Так что эта система нуждается в перезагрузке. U4 против U3 прямо в конце.

Возможно, вам придется прокрутить поле выше. В / proc / version важна версия ближе к концу строки.

Незначительное изменение кода версии типично для обновления ядра безопасности Debian.

needrestart

Другой вариант - установить needrestartпакет.

sudo apt-get install needrestart
sudo needrestart -k

Кажется, работает, даже если Needrestart был установлен после обновления ядра.


1
Как ваш первый абзац соотносится с версиями Ubuntu?
Муру

Хорошая точка зрения. Благодарю. Я потратил так много времени на тестирование и тестирование пакетов, что пропустил этот бит. Я отредактировал, чтобы сделать более понятным и включить информацию о пакете Ubuntu.
Тим Брей

На 8.04, после обновления, которое требовало перезапуска, Cog стал красным. Как мне вернуть это поведение?
PenguinCSC

Ubuntu 14.04, я получаюdpkg-query: no packages found matching linux-image-*
the_nuts

Unknown option: kв Ubuntu 14.04.
Сис Тиммерман

7

Я добавил следующее в мой файл .bash-aliases:

alias rr='if [ -f /var/run/reboot-required ]; then echo "reboot required"; else echo "No reboot needed"; fi'

Казалось бы, проще, чем установить пакет для этой относительно простой задачи. Тогда я просто бегу:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 

1

Бедное мужское решение:

#!/bin/bash
default=$(sed -n 's/^default[   ]*\([0-9][0-9]*\).*/\1/p' /boot/grub/menu.lst | tail -1)
if [ "$default" = "" ]; then default=0; fi

want=$(sed -n 's/^kernel[       ]*\/boot\/vmlinuz-\([^  ]*\).*/\1/p' /boot/grub/menu.lst | sed -n "$((default+1))p")

running=$(uname -r)

if [ "$running" = "$want" ]
then
        : OK, do nothing
else
        echo "Running $running, want $want. Reboot required."
fi

(Примечание: три случая квадратных скобок с пробелами внутри должны быть «[<space> <tab>]».)


grub 2 больше не использует /boot/grub/menu.lst, теперь он /boot/grub/grub.cfg.
Мариус Гедминас

-1

Не ответ на вопрос, но предостережение относительно нескольких ответов: /var/run/reboot-requiredэто не надежный источник того, действительно ли требуется перезагрузка.

Простой тест: когда новое ядро ​​станет доступным, установите его, перезагрузите компьютер. После перезагрузки запустите, apt autoremoveчтобы избавиться от некоторых старых, больше не требующихся ядер. После того, как вы запустите это, будет указано, что требуется перезагрузка, что является полной ерундой.


3
Что ж, удаление ядра заново генерирует ваш конфигурационный файл grub, после чего, вероятно, будет хорошей идеей перезагрузиться, чтобы убедиться, что вы все еще можете загрузиться. По крайней мере, так я оправдываю эту (неправильную) функцию для себя.
Мариус Гедминас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.