Linux系统下的重启,关机命令以及reboot挂死问题解决方案

2024-12-02 178552 日常编程

本文介绍了Linux系统中关机和重启的命令及其作用,以及系统运行等级的差别,此外,还分享了一个解决reboot关机卡死问题的方法

目录
  • Linux开关机
    • reboot 重启
    • shutdown 关机
    • poweroff 用于关闭计算机
    • 问题描述
    • 问题解决尝试
    • 这几种命令区别在哪里呢
  • 总结

    Linux开关机

    在Linux下,我们常用 shutdown、reboot、poweroff、halt等进行关机或重启

    另外还有就是直接使用 init 修改循行等级进行,如:init 0、init 6等

    各命令的作用:

    reboot 重启

    可接参数如下:

    Reboot the system.
    
         --help      Show this help
         --halt      Halt the machine
      -p --poweroff  Switch off the machine   
         --reboot    Reboot the machine
      -f --force     Force immediate halt/power-off/reboot  
      -w --wtmp-only Don't halt/power-off/reboot, just write wtmp record
      -d --no-wtmp   Don't write wtmp record
         --no-wall   Don't send wall message before halt/power-off/reboot

    这里主要讲一下`reboot -f`,强制重启

    在使用`reboot`这个命令过程中,有在CentOS8.2系统中遇到reboot挂死,约等待

    30mins才能关机然后重新启动,后来修改命令为`reboot -f`之后,问题解决

    关机流程:

    • 1.通知所有运行中的进程:系统将发送SIGTERM信号给所有正在运行的进程,通知它们系统即将关机。
    • 2.停止所有运行中的进程:系统会逐个终止所有正在运行的进程,直到没有剩余进程为止。
    • 3.关闭所有打开的文件:系统会关闭所有打开的文件,确保所有数据都被正确地写入到磁盘中。
    • 4.停止所有设备:系统会停止所有设备的运行,包括磁盘、网络设备和其他硬件设备。
    • 5.关闭内核:系统会释放内核占用的所有资源,并退出内核运行状态。
    • 6.重启计算机:系统会发送一个重启指令给计算机,计算机将重新启动,并加载操作系统。

    相似的reboot命令:

    system reboot
    shutdown -r now
    init 6

    shutdown 关机

    [root@localhost ~]# shutdown --help
    shutdown [OPTIONS...] [TIME] [WALL...]
    
    Shut down the system.
    
         --help      Show this help
      -H --halt      Halt the machine
      -P --poweroff  Power-off the machine
      -r --reboot    Reboot the machine
      -h             Equivalent to --poweroff, overridden by --halt
      -k             Don't halt/power-off/reboot, just send warnings
         --no-wall   Don't send wall message before halt/power-off/reboot
      -c             Cancel a pending shutdown

    poweroff 用于关闭计算机

    halt 用于关闭计算机或进入停机状态,有些系统是调用shutdown -h 或poweroff

    再深入了解一下系统运行等级的差别:

    首先明确一下linux/redhat系的runlevel运行级别和debian系的runlevel是有所不同的。

    redhat系的runlevel定义如下:

    • runlevel 0: halt 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
    • runlevel 1: single user 单用户工作状态,root权限,用于系统维护,禁止远程登陆
    • runlevel 2: multiuser without network 多用户状态(没有NFS)
    • runlevel 3: multiuser 完全的多用户状态(有NFS),登陆后进入控制台命令行模式
    • runlevel 4: unuse 系统未使用,保留
    • runlevel 5: x11 X11控制台,登陆后进入图形GUI模式
    • runlevel 6: reboot 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

    在debian/ubuntu中,runlevel的定义为:

    0 - Halt
    1 - Single
    2 - Full multi-user with display manager (GUI)
    3 - Full multi-user with display manager (GUI)
    4 - Full multi-user with display manager (GUI)
    5 - Full multi-user with display manager (GUI)
    6 - Reboot

    可以发现2~5级是没有任何区别的。

    Ubuntu系统默认的运行级别为2。

    因此,我们可以使用init 0来执行halt关机,使用init 6来执行reboot。

    其实shutdown命令也是在执行完一系列操作后,比如说逐个关闭进程/服务,调用sync将数据写入磁盘等,然后调用init0或init6来执行关机或重启而halt实际上是调用shutdown -h now,可以不理会系统当前状态而直接关机,但在有的系统中,halt不会关闭电源,而只关闭了os。

    问题描述

    reboot 发生挂死,reboot关机时卡了近半个小时,才能关机下去,重启上电流程无异常。

    环境:

    CentOS Stream release 8
    Linux 4.18.0-500.el8.x86_64
    systemd 239 (239-76.el8)

    问题解决尝试

    首先当然从系统入手,我查询了/var/log/messages上面记录的内容,发现没什么错误信息

    先没有计较太多,我直接使用yum update更新了一下我的系统,再次尝试

    1,百度寻医问药,修改/etc/systemd/system.conf ,修改系统参数,但是并未有改善,此方案不适用我这边的状况

    2,尝试其他的reboot方案,都会发生挂死,命令如下:

    system reboot
    shutdown -r now
    init 6

    3,最后尝试使用reboot -f,此时系统reboot 正常,并未发现重启挂死的状况

    20230914 解决了reboot关机卡死状况,解决办法如下:

    1、新建/etc/systemd/system/rc-local.service并写入

    	[Unit]
    	Description=/etc/rc.d/rc.local Compatibility
    	ConditionFileIsExecutable=/etc/rc.d/rc.local
    	After=network.target
    	[Service]
    	Type=forking
    	ExecStart=/etc/rc.d/rc.local start
    	TimeoutSec=5
    	RemainAfterExit=yes

    2、备份/etc/systemd/system.conf

    cp -a /etc/systemd/system.conf /etc/systemd/system.conf_bak

    3、修改文件

    sed -i 's/#DefaultTimeoutStopSec=90s/DefaultTimeoutStopSec=30s/g' /etc/systemd/system.conf

    4、重新加载

    systemctl daemon-reload

    这几种命令区别在哪里呢

    目前仅仅知道 reboot -f 会 强制重新开机,不调用shutdown指令的功能,看起来跟普通的重启动作是不同的,或许会发生数据丢失的状况,从描述来看,少做了很多动作。

    reboot命令OS的动作:

    1、结束所有运行中的进程:系统会发送SIGTERM信号给所有正在运行的进程,通知它们系统即将重启。

    2、保存当前系统状态:系统会将当前系统的状态保存到/var/log/wtmp文件中,包括系统的运行时间、用户登录信息等。

    3、停止所有设备:系统会停止所有设备的运行,包括磁盘、网络设备和其他硬件设备。

    4、重启计算机:系统会发送一个重启指令给计算机,计算机将重新启动,并加载操作系统

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持就爱读。

    您可能感兴趣的文章:

    • Linux系统关机命令之间的区别及用法详解
    • Linux命令学习总结:详解reboot命令
    • Linux服务上MySQL启动、重启和关闭的操作方法
    • Linux系统中检查系统重启记录方案
    • Linux系统重启后MySQL数据丢失问题的解决步骤

    如何修复 Discord Bot 无法响应命令的问题

    本文详解DiscordBot不响应命令的常见原因及解决方案,重点解决因权限配置缺失(尤其是message_content意图未启用)和错误使用Client类导致的命令失效问题,并提供可直接运行的修正代码。 本文详解discordbot不响应命令的常见原因及解决方案,重点解决因权限配置缺失(尤其是`message_content`意图未启用)和错误使用`client`类导致的命令失效问题,并提供可直...

    如何在 Shell 脚本中正确调用 Singularity 容器执行命令

    本文详解如何在Shell脚本中非交互式地运行Singularity容器内的命令(如Python脚本),避免误用singularityshell导致的执行失败、段错误或挂起问题。 本文详解如何在shell脚本中非交互式地运行singularity容器内的命令(如python脚本),避免误用`singularityshell`导致的执行失败、段错误或挂起问题。 在Shell脚本中调用Singulari...

    Docker容器挂掉后Python如何自动报警与拉起重启

    Python无法可靠获取容器崩溃的退出信号,应通过外部监控(如dockerevents)报警,并用tini或os.execv确保信号传递,避免在容器内使用supervisor等进程管理器。 容器崩溃时Python怎么拿到确切的退出信号 Docker容器挂掉,本质是主进程(ENTRYPOINT或CMD指定的进程)退出。Python脚本如果直接作为PID1运行,它收不到SIGTERM以外的大多数信号(...

    如何清理Python项目中产生的__pycache__冗余文件_使用find命令批量删除

    精准定位所有__pycache__目录应使用find.-typed-name'__pycache__',其中-typed限定为目录类型,-name精确匹配大小写敏感的固定名称,引号防止shell展开,避免误用-iname或通配符。 find命令怎么精准定位所有__pycache__目录 默认情况下,find会递归遍历整个目录树,但容易误删或漏删——关键在指定类型和路径模式。__pycache__是...

    Python证书链验证失败的根源与正确OpenSSL命令解析

    本文详解pythoncryptography.x509构建多级证书链(根→中间→终端)时,openssl验证报错unabletogetissuercertificate的真实原因——并非代码缺陷,而是证书链加载方式错误;重点阐明-untrusted参数的关键作用及完整验证流程。 本文详解pythoncryptography.x509构建多级证书链(根→中间→终端)时,openssl验证报错unab...

    如何在Python中实现可撤销的数据操作队列_通过双栈模拟或命令模式

    双栈结构更适合轻量级撤销队列,因其内存和逻辑更直接:仅存状态快照或增量变更,避免命令模式的类抽象与生命周期开销;对list/dict/数值等原子操作,浅拷贝+双栈即可覆盖90%场景,且undo/redo为O(1)。 为什么双栈结构比命令模式更适合轻量级撤销队列 双栈(undo_stack和redo_stack)在内存和逻辑上更直接:每次操作只存状态快照或简单变更描述,不需为每类操作定义新类。命令模...

    如何在 Python Tkinter 循环中实现命令间的精确暂停

    Tkinter中不能直接用time.sleep()实现界面响应式延时,需改用root.after()方法在事件循环中调度任务,才能让窗口逐个延迟创建而不阻塞GUI。 tkinter中不能直接用`time.sleep()`实现界面响应式延时,需改用`root.after()`方法在事件循环中调度任务,才能让窗口逐个延迟创建而不阻塞gui。 在Tkinter应用中,使用time.sleep()会导致整...

    Windows 上 py 命令未指向最新 Python 版本的解决方法

    Windows的py启动器默认应调用系统中最新安装的Python,但若py--version与python3--version显示不同版本,说明启动器的默认配置未同步——可通过py-0p查看已注册版本,并用py-3.12--default手动设为最新版。 windows的`py`启动器默认应调用系统中最新安装的python,但若`py--version`与`python3--version`显示不...