45
45
46
46
# default options
47
47
AUTOCONFIRM=0 # autoconfirmation
48
- DBUS=1 # relauch when dbus
49
48
FAILED=1 # display failed service at the end
50
49
PACDIFF=1 # run pacdiff
51
50
RELOAD=1 # reload systemd
@@ -56,7 +55,12 @@ USER_SLICE=0 # act on users services
56
55
MACHINE_SLICE=0 # act on machine services
57
56
58
57
# ignored service list
59
- IGNORED_SERVICES=(" getty@tty.*.service" " systemd-logind.service" " dbus-broker.service" )
58
+ IGNORED_SERVICES=(
59
+ " getty@tty.*.service"
60
+ " systemd-logind.service"
61
+ " dbus-broker.service"
62
+ " auditd.service"
63
+ )
60
64
61
65
# print $* as an arrow line
62
66
arrow () {
@@ -77,21 +81,21 @@ error() {
77
81
# return : 0 - found
78
82
# 1 - not found
79
83
in_array () {
80
- local needle=$1 ; shift
84
+ local needle=" $1 " ; shift
81
85
local item
82
86
for item in " $@ " ; do
83
- [[ $item = $needle ]] && return 0 # Found
87
+ [[ $item = " $needle " ]] && return 0 # Found
84
88
done
85
89
return 1 # Not Found
86
90
}
87
91
88
92
# ask for confirmation
89
93
# return 0 when confirmed, otherwise 1
90
94
confirm () {
91
- (( $ AUTOCONFIRM == 1 )) && return 0
95
+ (( AUTOCONFIRM == 1 )) && return 0
92
96
local -i try
93
97
local ans
94
- for try in 5 4 3 2 1 ; do
98
+ for (( try= 1 ; try <= 5 ; try ++ )) ; do
95
99
printf ' %s [Yes|No] ' " $1 "
96
100
read -r ans || return 1
97
101
case $ans in
@@ -105,7 +109,9 @@ confirm() {
105
109
106
110
# get running systemd services
107
111
get_services () {
108
- systemctl --no-legend --full --type service --state running | tr -d ' ●' | awk ' {print $1}' | grep -v $( printf -- ' -e %s ' " ${IGNORED_SERVICES[@]} " )
112
+ local -a grep_patterns
113
+ read -r -a grep_patterns <<< " $(printf -- '-e %s ' " ${IGNORED_SERVICES[@]} " )"
114
+ systemctl --no-legend --full --type service --state running | tr -d ' ●' | awk ' {print $1}' | grep -v " ${grep_patterns[@]} "
109
115
}
110
116
111
117
# get systemd services with updated mapped files
@@ -128,10 +134,10 @@ get_broken_maps() {
128
134
done
129
135
[[ -z " $pidfile " ]] && error " Unable to find pid file for $service ." && continue
130
136
# skip non system units
131
- (( $ USER_SLICE == 0 )) && [[ " $unit_path " =~ /user\. slice/ ]] && continue
132
- (( $ MACHINE_SLICE == 0 )) && [[ " $unit_path " =~ /machine\. slice/ ]] && continue
137
+ (( USER_SLICE == 0 )) && [[ " $unit_path " =~ /user\. slice/ ]] && continue
138
+ (( MACHINE_SLICE == 0 )) && [[ " $unit_path " =~ /machine\. slice/ ]] && continue
133
139
# parse pidfile
134
- pids=( $( < " $pidfile " ) )
140
+ mapfile -t pids < " $pidfile "
135
141
if (( "${# pids[*]} " == 0 )) ; then
136
142
error " Unable to parse pid file for $service ."
137
143
continue
@@ -145,7 +151,7 @@ get_broken_maps() {
145
151
# only file mapped as executable
146
152
deleted=" $( grep -F ' (deleted)' " $maps_path " | sed -nr ' s|^\S+ ..x. \S+ \S+ \S+ \s+||p' | grep -v " /memfd:" ) "
147
153
if [[ $deleted ]]; then
148
- printf " %s\n" $service
154
+ printf " %s\n" " $service "
149
155
break
150
156
fi
151
157
done
@@ -161,12 +167,13 @@ get_dbus_names() {
161
167
# get systemd services not registered on dbus system bus
162
168
get_missing_dbus () {
163
169
local service busname
164
- local -a registered=($( get_dbus_names) )
170
+ local -a registered
171
+ mapfile -t registered < <( get_dbus_names)
165
172
for service in $( get_services) ; do
166
173
# get the service registered bus name
167
174
busname=" $( systemctl --property BusName --value show " $service " ) "
168
175
if [[ " $busname " ]] && ! in_array " $busname " " ${registered[@]} " ; then
169
- echo $service
176
+ echo " $service "
170
177
fi
171
178
done
172
179
}
@@ -192,10 +199,10 @@ restart_services() {
192
199
for service; do
193
200
echo " systemctl restart $service "
194
201
systemctl restart " $service " &
195
- if (( $ SERIALIZE )) ; then
202
+ if (( SERIALIZE )) ; then
196
203
wait
197
204
# display status directly when serialize and not quiet
198
- (( $ STATUS )) && systemctl --no-pager --lines=0 status " $service "
205
+ (( STATUS )) && systemctl --no-pager --lines=0 status " $service "
199
206
else
200
207
# register pids
201
208
registered_pids[$! ]=" $service "
@@ -204,25 +211,25 @@ restart_services() {
204
211
205
212
# display status as soon as available when not serialized
206
213
while (( ${# registered_pids[*]} )) ; do
207
- # wait for process at least one process to finish
214
+ # wait for at least one process to finish
208
215
wait -n
209
216
210
- running_pids=( $ ( jobs -p) )
217
+ mapfile -t running_pids < < ( jobs -p)
211
218
212
219
# count registered pid for loop protection
213
220
last_registered_pids_count=${# registered_pids[*]}
214
221
215
222
for pid in " ${! registered_pids[@]} " ; do
216
223
in_array " $pid " " ${running_pids[@]} " && continue
217
224
# show units status
218
- (( $ STATUS )) && systemctl --no-pager --lines=0 status " ${registered_pids[$pid]} "
219
- unset registered_pids[$pid ]
225
+ (( STATUS )) && systemctl --no-pager --lines=0 status " ${registered_pids[$pid]} "
226
+ unset " registered_pids[$pid ]"
220
227
break
221
228
done
222
229
223
230
# ensure we are not at 1st infinite loop
224
231
# if we didn't remove a process something wrong happen
225
- if (( $ last_registered_pids_count == ${# registered_pids[*]} )) ; then
232
+ if (( last_registered_pids_count == ${# registered_pids[*]} )) ; then
226
233
error " Unable to wait processes to finish"
227
234
error " Registered PIDs: ${registered_pids[*]} "
228
235
error " Running PIDs: ${running_pids[*]} "
@@ -276,10 +283,10 @@ argparse() {
276
283
U) USER_SLICE=0;; u) USER_SLICE=1;;
277
284
M) MACHINE_SLICE=0;; m) MACHINE_SLICE=1;;
278
285
Z) SERIALIZE=0;; z) SERIALIZE=1;;
279
- i) if [[ " $OPTARG " == * .service ]]; then
286
+ i) if [[ " $OPTARG " == * .service ]]; then
280
287
IGNORED_SERVICES+=(" $OPTARG " )
281
- else
282
- usage
288
+ else
289
+ usage
283
290
fi
284
291
;;
285
292
* ) usage;;
@@ -298,19 +305,20 @@ main() {
298
305
argparse " $@ "
299
306
300
307
# from now, we need to be root
301
- (( $ UID != 0 )) && error ' You need to be root' && exit 1
308
+ (( UID != 0 )) && error ' You need to be root' && exit 1
302
309
303
310
# call pacdiff to ensure config files are updated before restart
304
- if (( $ PACDIFF )) ; then
311
+ if (( PACDIFF )) ; then
305
312
arrow ' Run pacdiff'
306
313
pacdiff
307
314
fi
308
315
309
316
# ensure systemd has been reloaded or reexectued
310
- (( $ RELOAD )) && reload_systemd
317
+ (( RELOAD )) && reload_systemd
311
318
312
319
arrow ' Services with broken maps files'
313
- local -a broken_services=($( get_broken_maps) )
320
+ local -a broken_services
321
+ mapfile -t broken_services < <( get_broken_maps)
314
322
echo " Found: ${# broken_services[@]} "
315
323
if (( ${# broken_services[@]} )) ; then
316
324
if (( RESTART )) ; then
@@ -325,7 +333,8 @@ main() {
325
333
fi
326
334
327
335
arrow ' Services missing on the system bus'
328
- local -a missing_services=($( get_missing_dbus) )
336
+ local -a missing_services
337
+ mapfile -t missing_services < <( get_missing_dbus)
329
338
echo " Found: ${# missing_services[@]} "
330
339
if (( ${# missing_services[@]} )) ; then
331
340
if (( RESTART )) ; then
@@ -340,7 +349,7 @@ main() {
340
349
fi
341
350
342
351
# list only failed systemd units
343
- if (( $ FAILED )) ; then
352
+ if (( FAILED )) ; then
344
353
arrow " List failed units"
345
354
systemctl --failed --all --no-pager --no-legend --full list-units
346
355
fi
0 commit comments