shutdown -r и reboot. Сейчас всё это не имеет значения, так как реально всем управляет systemd. А если посмотреть на shutdown и reboot, то окажется, что это символьные ссылки на systemctl. # whereis rebootreboot: /usr/sbin/reboot# ls -la /usr/sbin/reboot/usr/sbin/reboot -> /bin/systemctl# whereis shutdownshutdown: /usr/sbin/shutdown# ls -la /usr/sbin/shutdown/usr/sbin/shutdown -> /bin/systemctlТо есть не важно, как вы перезагрузите сервер. Всё равно команда будет отправлена в systemd. В некоторых инструкциях и статьях вижу, что сервер перезагружают так:
# systemctl rebootНабирать systemctl не обязательно. Обычный reboot выполнит ту же самую команду.
Возникает вопрос, а как systemctl понимает, какую команду надо выполнить? Символьные ссылки одинаковы в обоих случаях и ведут просто в
/bin/systemctl. С помощью механизма запуска программ execve можно узнать имя исполняемой команды. Примерно так:$ bash -c 'echo $0'bash$0 покажет имя запущенной команды. В systemctl стоит проверка вызванной команды, поэтому она определяет, что реально вы запустили - reboot или shutdown. Вообще, в systemctl столько всего наворочено. Перезагрузить компьютер так же можно следующими командами:# systemctl start reboot.target# systemctl start ctrl-alt-del.targetЭти команды делают то же самое, что и reboot. По крайней мере на первый взгляд. Остаётся только гадать, зачем там всё это. Ну либо где-то в манах или исходниках читать.
Дам ещё небольшую подсказку в рамках этой темы. И shutdown, и reboot, и systemctl в итоге обращаются к бинарнику на диске. Если у вас какие-то проблемы с диском и не удаётся прочитать этот бинарник, то перезагрузка не состоится. Всё будет продолжать висеть. Если запущена консоль, то можно через неё сразу передать команду на перезагрузку напрямую ядру
# echo b > /proc/sysrq-triggerСервер тут же перезагрузится, как будто у него физически нажали reset.
#linux