使用checkrestart/needrestart确定需要重启的进程
适当的软件补丁管理有助于减少系统弱点。但即使您修补了过时的系统,旧的进程和库仍可能在内存中继续运行。例如,当库更新时,活动程序可能仍在使用旧版本。要真正完成软件修补过程,我们必须做更多工作。这包括准备、执行更新,最后检查是否需要重启软件组件。在本文中,我们将了解几种正确执行此过程最后部分的选择,并介绍checkrestart和needrestart等工具。
Checkrestart
第一个帮助查找使用旧文件进程的实用程序是checkrestart。它是debian-goodies软件包的一部分,仅适用于基于Debian的系统。它使用lsof确定打开的文件以及使用此类资源的进程。
安装
1
|
apt install debian-goodies
|
要求
- Debian(或克隆版本)
- Python
- LSOF
- root权限
使用
运行checkrestart命令将概述其发现的内容以及哪些进程需要重启。它显示使用旧文件的进程,并确定与这些进程相关的init脚本。当然,仅限于它能找到的脚本。对于其他进程,它将显示相关进程,以便您可以手动采取措施。
示例输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# checkrestart
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
Found 68 processes using old versions of upgraded files
(48 distinct programs)
(40 distinct packages)
Of these, 7 seem to contain init scripts which can be used to restart them:
The following packages seem to have init scripts that could be used
to restart them:
sudo:
3908 /usr/bin/sudo
cups-browsed:
1457 /usr/sbin/cups-browsed
samba:
965 /usr/sbin/smbd
700 /usr/sbin/smbd
2371 /usr/sbin/nmbd
mdm:
1491 /usr/sbin/mdm
pulseaudio:
3039 /usr/bin/pulseaudio
cups-daemon:
3568 /usr/sbin/cupsd
dbus:
2822 /bin/dbus-daemon
3477 /bin/dbus-daemon
2385 /bin/dbus-daemon
2836 /bin/dbus-daemon
507 /bin/dbus-daemon
These are the init scripts:
service sudo restart
service cups-browsed restart
service samba-ad-dc restart
service smbd restart
service samba restart
service nmbd restart
service mdm restart
service pulseaudio restart
service cups restart
service dbus restart
These processes do not seem to have an associated init script to restart them:
udisks2:
3162 /usr/lib/udisks2/udisksd
policykit-1:
918 /usr/lib/policykit-1/polkitd
modemmanager:
783 /usr/sbin/ModemManager
blueman:
3255 /usr/bin/blueman-applet
network-manager:
912 /usr/sbin/NetworkManager
mate-polkit:amd64:
3257 /usr/lib/x86_64-linux-gnu/polkit-mate-authentication-agent-1
xserver-xorg-core:
1498 /usr/bin/Xorg
gvfs-daemons:
3143 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
3554 /usr/lib/gvfs/gvfsd-metadata
3321 /usr/lib/gvfs/gvfsd-trash
mate-keyring:
2996 /usr/bin/mate-keyring-daemon
caja:
3236 /usr/bin/caja
system-tools-backends:
3487 /usr/sbin/system-tools-backends
gvfs-backends:
3214 /usr/lib/gvfs/gvfs-mtp-volume-monitor
3203 /usr/lib/gvfs/gvfs-afc-volume-monitor
3208 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
marco:
3015 /usr/bin/marco
upower:
3272 /usr/lib/upower/upowerd
mintupdate:
3821 /usr/lib/linuxmint/mintUpdate/mintUpdate.py
mate-screensaver:
3258 /usr/bin/mate-screensaver
at-spi2-core:
3472 /usr/lib/at-spi2-core/at-spi-bus-launcher
dnsmasq-base:
2142 /usr/sbin/dnsmasq
3543 /usr/sbin/dnsmasq
mate-bluetooth:
3261 /usr/bin/mate-bluetooth-applet
consolekit:
2476 /usr/sbin/console-kit-daemon
gvfs-fuse:
3023 /usr/lib/gvfs/gvfsd-fuse
google-chrome-stable:
3646 /opt/google/chrome/chrome
3859 /opt/google/chrome/chrome
3642 /opt/google/chrome/chrome
3683 /opt/google/chrome/chrome
3675 /opt/google/chrome/chrome
3666 /opt/google/chrome/chrome
3612 /opt/google/chrome/chrome
3691 /opt/google/chrome/chrome
5706 /opt/google/chrome/chrome
3694 /opt/google/chrome/chrome
3601 /opt/google/chrome/chrome
3698 /opt/google/chrome/chrome
3621 /opt/google/chrome/chrome
3708 /opt/google/chrome/chrome
3616 /opt/google/chrome/nacl_helper
mate-terminal:
3891 /usr/bin/mate-terminal
mate-settings-daemon-pulse:
2987 /usr/bin/mate-settings-daemon
system-config-printer-gnome:
3252 /usr/share/system-config-printer/applet.py
mate-session-manager:
2547 /usr/bin/mate-session
isc-dhcp-client:
2024 /sbin/dhclient
mintmenu:
3049 /usr/lib/linuxmint/mintMenu/mintMenu.py
mate-media-pulse:
3259 /usr/bin/mate-volume-control-applet
network-manager-gnome:
3248 /usr/bin/nm-applet
3263 /usr/bin/nm-applet
mate-panel:
3055 /usr/lib/mate-panel/clock-applet
3032 /usr/bin/mate-panel
3051 /usr/lib/mate-panel/wnck-applet
login:
3909 /bin/su
mate-power-manager:
3244 /usr/bin/mate-power-manager
|
从该输出中,我们可以看到哪些进程可以重启,以及相关的init脚本。此外,它还显示哪些进程也需要重启,但缺少相关脚本。
Checkrestart状态
该实用程序完成了它应该做的工作。但是,它仅限于基于Debian的系统,并且代码包含许多"待办"项。如果您正在评估本文中的软件组件,您肯定想了解更多关于Needrestart的信息。
Needrestart
另一个实用程序是needrestart。与checkrestart一样,它在运行软件升级后确定哪些进程需要重启。它是同名软件包的一部分,用Perl编写。它似乎维护良好,并支持较新的技术,如容器(LXC、Docker)。该工具挂钩到更新过程中,例如,它可以在运行"dpkg upgrade"后重启服务。也可以手动运行它,特别是仅列出进程的模式,提供按进程(交互式)重启的选项,或自动全部重启。
支持的包管理器
Needrestart开箱即用地支持一些包管理器:
Needrestart使用包管理器的功能来确定哪个相关包或守护进程需要重启。它通过查找相关的启动脚本来实现这一点。对于使用DPKG的系统,它实际上使用了前面提到的checkrestart实用程序的一些智能。对于RPM,它利用rpmquery实用程序,对于pacman,则使用pacman实用程序本身。
安装
Debian / Ubuntu
1
|
apt install needrestart
|
Fedora
对于我们的Fedora系统,我们使用以下步骤使该工具工作。您可以使用自定义软件包来简化依赖项的处理,而不是使用Git。由于我们仅将其用于Fedora 21测试服务器上的测试,因此我们安装依赖项并从root主目录运行它。
1
2
3
4
5
6
7
|
# cd /root
# yum -y -d1 install git perl-Module-ScanDeps perl-Proc-ProcessTable perl-Sort-Naturally perl-Term-ProgressBar-Simple perl-Module-Find.noarch perl-ExtUtils-MakeMaker.noarch
# git clone https://github.com/liske/needrestart
# cp /root/needrestart/needrestart.conf /etc/needrestart/needrestart.conf
# mkdir /etc/needrestart/hook.d
# cp /root/needrestart/ex/hooks/* /etc/needrestart/hook.d
# perl -I /root/needrestart/perl/lib ./needrestart -r l
|
Needrestart配置
默认情况下,此实用程序不需要太多配置。它开箱即用效果很好。当需要调整工具的行为时,可以通过配置文件/etc/needrestart/needrestart.conf完成。配置文件中找到的一些选项也可以通过命令行调整(例如操作类型)。
那么有什么可以配置的呢?默认的重启模式、应忽略哪些进程等。通过这种方式,您可以更改实用程序以完成其工作,同时避免重启系统中不需要的部分。
Needrestart实战
在运行安全更新后,我们将运行needrestart。在此示例中,我们在Fedora系统上使用它。在应用了数百个软件补丁后,我们以列表模式(-r l)运行该工具:
Needrestart发现了几个需要重启的进程。该工具甚至检查是否正在运行最新安装的内核,并发现有过时的内核处于活动状态。在这种情况下,完整的系统重启甚至会更好。
使用哪一个?
在审查两者之后,请选择needrestart实用程序。它可在多个基于Linux的系统上运行,维护良好,支持较新的技术,并且工作效果非常好。与往常一样,我们鼓励首先在非生产系统上进行测试。
发现了更好的工具来处理这项工作?请告诉我们!