Единственная обязательная причина для перезагрузки - новое ядро (и вы можете выполнить мягкую перезагрузку с помощью kexec). См. https://wiki.archlinux.org/index.php/Kexec для подробностей, вкратце:
загрузите новое ядро, initramfs и укажите командную строку загрузки
kexec -l / boot / new-kernel --initrd = / boot / new-initramfs --reuse-cmdline
вызвать kexec
(используйте systemctl
для правильного завершения работы, ] kexec -e
будет выполняться напрямую)
systemctl kexec
Обратите внимание, что если вы создаете kexec-load @ .service
, как описано в вики, если вы После перезагрузки systemd
автоматически выполнит мягкую перезагрузку с использованием kexec
вместо перезагрузки BIOS
Немного улучшенная версия, которая дает имена служб systemd:
PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u
или однострочное:
for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u
Обратите внимание, что есть некоторые проблемы:
systemctl daemon-reload
должен выполняться до перезапуска чего-либо еще сам systemd
) должен быть перезапущен, он может выполняется с помощью systemctl daemon-reexec
systemctl restart dbus.service
нарушает работу некоторых других служб, их необходимо перезапустить после перезапуска dbus:
systemd
сама: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
не перезапускает его, пока вы подключены, я вижу 2 варианта:
systemctl restart sshd
с использованием в / cron / systemd
таймеры SSH
с использованием другой удаленной (защищенной) оболочки, такой как mosh
screen / tmux
, также могут блокировать такие службы, как SSH
от перезапуска, самый простой способ - закрыть эти сеансы перед перезапуском служб Это ошибка, которую выдает ksh88 (, /bin/ksh
Solaris 10 и старше, и /usr/xpg4/bin/sh
).
Хотя синтаксис [[... ]]
происходит от ksh, =~
внутри является одним из очень немногих настоящих башизмов. bash
на самом деле была оболочкой, которая представила его (в версии 3.0 ).
Позже он был добавлен в ksh93
(, поэтому будет работать с /bin/sh
и /bin/ksh
в Solaris 11 и новее )и zsh
, с вариациями (оператор =~
также доступен в test
/ [
builin zsh
иyash
). ksh88 не обновлялся с 90-х годов (, за исключением исправления ошибок или исправления соответствия POSIX в некоторых системах ).
Здесь вам не нужно регулярное выражение, шаблон подстановочных знаков тоже сработает:
[[ $APP_OPTION = [1-$APP_COUNT] ]]
С оператором =
(из ksh )правый операнд является шаблоном подстановочных знаков. Или вы можете использовать стандартный способ сопоставления с образцом:
case $APP_OPTION in
[1-$APP_COUNT])...
esac
Обратите внимание, что это не будет работать для любого значения больше 9. [1-12]
, то же, что [21-1]
соответствует только 2 и 1 (и, возможно, другим символам, которые сопоставляются так же, как 1
в некоторых локалях. )).
Шаблоны подстановочных знаков ksh функционально эквивалентны расширенным регулярным выражениям (, за исключением {x,y}
интервальных операторов в современных вариантах ERE ), хотя и с другим синтаксисом:
.
->?
.*
->*
x*
->*(x)
x|y
->@(x|y)
x?
->?(x)
x+
->+(x)
[^x]
->[!x]
x{3,5}
->xxx?(x)?(x)
(у ksh93 есть {3,5}(x)
, а не у ksh88 ). Если вам по-прежнему необходимо использовать регулярные выражения, вам потребуется использовать отдельную утилиту:
expr "x$string" : "x$regexp" # BRE, anchored at the start
STRING=$string RE=$regexp command -p awk '
BEGIN{exit(!(ENVIRON["STRING"] ~ ENVIRON["RE"]))}'