关闭

linux shutdown related

272人阅读 评论(0) 收藏 举报
分类:

inux关机命令详解 在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都
可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希
望你可以更加灵活的运用各种关机命令。
  1.shutdown
shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux,
这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能
会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备。
而在系统关机前使用shutdown命令,系统管理员会通知所有登录的用户系统将要关闭。
并且login指令会被冻结,即新的用户不能再登录。直接关机或者延迟一定的时间才关机
都是可能的,还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕
决定的。这让像vi之类的程序有时间储存目前正在编辑的文档,而像处理邮件〔mail〕和
新闻〔news〕的程序则可以正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序,要求它改变runlevel。
Runlevel 0被用来停机〔halt〕,runlevel 6是用来重新激活〔reboot〕系统,
而runlevel 1则是被用来让系统进入管理工作可以进行的状态;这是预设的,假定没有-h也
没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些
动作,你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。
   shutdown 参数说明:
   [-t] 在改变到其它runlevel之前,告诉init多久以后关机。
   [-r] 重启计算器。
   [-k] 并不真正关机,只是送警告信号给每位登录者〔login〕。
   [-h] 关机后关闭电源〔halt〕。
   [-n] 不用init,而是自己来关机。不鼓励使用这个选项,而且该选项所产生的后果往
往不总是你所预期得到的。
   [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有
时间参数,但是可以输入一个用来解释的讯息,而这信息将会送到每位使用者。
   [-f] 在重启计算器〔reboot〕时忽略fsck。
[-F] 在重启计算器〔reboot〕时强迫fsck。
   [-time] 设定关机〔shutdown〕前的时间。

注:shutdown的时候比如shutdown now有时还是关闭不了,提示有些进程没结束而导致关机失败,
这时shutdown now -h或许就能解决,因为-h是彻底的关机
     
2.halt—-最简单的关机命令
   其实halt就是调用shutdown -h。halt执行时,杀死应用进程,执行sync系统调用,
文件系统写操作完成后就会停止内核。
   参数说明:
   [-n] 防止sync系统调用,它用在用fsck修补根分区之后,以阻止内核用老版本的超
级块〔superblock〕覆盖修补过的超级块。
   [-w] 并不是真正的重启或关机,只是写wtmp〔/var/log/wtmp〕纪录。
   [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
   [-f] 没有调用shutdown而强制关机或重启。
   [-i] 关机〔或重启〕前,关掉所有的网络接口。
   [-p] 该选项为缺省选项。就是关机时调用poweroff。
   shutdown -h now 即可立即关机
3.reboot
reboot的工作过程差不多跟halt一样,不过它是引发主机重启,而halt是关机。它
的参数与halt相差不多。
4.init
init是所有进程的祖先,它的进程号始终为1,所以发送TERM信号给init会终止所有的
用户进程、守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),
init 0为关机,init 1为重启。关于init可以长篇大论,这里就不再叙述。另外还有
telinit命令可以改变init的运行级别,比如,telinit -iS可使系统进入单用户模式,
并且得不到使用shutdown时的信息和等待时间。
5.poweroff–部分泛UNIX/LINUX系统才支持,红旗LINUX亦适用。

首先需要说明的的是,telinit 是init 的一个软连接。当系统起来后,init进程会占用PID 1,init程序会在入口处判断PID,如果不是1,就退出init处理程序,转而调用telinit.
if (!isinit) exit(telinit(p, argc, argv));, 作者这么设计,也就是为了让用户少敲三个字母而已。

好了,下面转入正题

telinit 或 init 命令
用途
初始化并控制进程
语法
{ telinit |init } {0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c |h | Q | q | S | s | M | m | N }
描述
init 命令初始化并控制进程。其首要任务是基于从文件 /etc/inittab 读入的记录启动进程。/etc/inittab 文件通常请求 init 命令在用户可登录的每一行上运行 getty 命令。init 命令控制系统所需的独立进程。
组成 init 命令的进程分派操作的主要进程是 /usr/sbin/getty。/usr/sbin/getty 进程启动单独终端行。其它典型地由init 命令分派的进程为守护进程和 shell。
链接到 init 命令的telinit 命令,指引init 命令的操作。telinit 命令引用单字符参数并通过kill 子例程发出init 命令从而执行适当的操作。
telinit 命令将系统设置在一特定的运行级别上。运行级别是允许仅选中的进程组存在的软件配置。系统可以在下列的运行级别之一上:
0-9 告知 init 命令将系统放置在 0-9 的其中一个运行级别上。当init 命令请求运行级别在0-9 中的更改时,它中止所有当前运行级别上的进程然后重新启动与新运行级别关联的任何进程。
0-1 预留给操作系统供将来使用。
2 包含运行在多用户环境之中的所有终端进程和守护进程。在多用户环境中,/etc/inittab 文件被设置,所以init 命令为系统的每一个终端创建一个进程。控制台设备驱动程序也被设置在所有运行级别上运行,因此系统仅能在活动的控制台上运行。
3-9 可根据用户的偏好定义。
S、s、M、m 告诉 init命令进入维护方式。当系统从另一运行级别进入维护方式,只有系统控制台被用作终端。
下列参数也作为 init 命令的伪指令:
a、b、c、h 告诉 init 命令只处理那些位于/etc/inittab 文件中,在运行级别字段中为 a、b、c 或h 的记录。这四个参数 a、b、c 和h 不是真正的运行级别。它们与运行级别的不同之处在于 init 命令无法要求整个系统进入运行级别a、b、c 或 h。
当 init 命令在/etc/inittab 文件中找到运行级别字段的值为 a、b、c 或h 的记录时,它会启动此进程。然而,它不会杀死处于当前运行级别的任何进程;除了已经运行在当前的系统运行级别的进程外,还会启动在运行级别字段中值为a、b、c 或h 的进程。真正的运行级别与 a、b、c 或h 的另一个区别在于以a、b、c 或h 开始的进程不会在 init 命令更改运行级别时停止。有三种方式停止a、b、c 或h 进程:
在 Action 字段中输入 off。
删除整个对象。
用 init命令进入维护状态。
Q,q 告诉 init 命令重新检查 /etc/inittab文件。
N 发送信号阻止进程被重新派生。
当系统启动时,当根文件系统已在预初始化过程之中安装,则发生下列事件序列:
init 命令作为启动过程的最后一步运行。
init 试图读/etc/inittab 文件。
如果 /etc/inittab 文件存在, init 命令试图定位 /etc/inittab文件中的一个 initdefault 条目。
如果 initdefault 条目存在,init 命令用指定的运行级别作为初始系统运行级别。
如果 initdefault 条目不存在,init 命令请求用户从系统控制台(/dev/console)输入一个运行级别。
如果用户输入了 S,s,M 或 m运行级别,init命令进入维护运行级别。这些是仅有的不要求正确格式的/etc/inittab 文件的运行级别。
如果 /etc/inittab 文件不存在,init 命令缺省将系统置于维护运行级别。
init 命令每 60 秒重读/etc/inittab 文件。如果 /etc/inittab 自从init 命令上次读取它时发生了改变,/etc/inittab文件中的新命令在系统启动时执行。
如请求 init 命令改变运行级别,init 命令读 /etc/inittab 文件以识别应当存在于新运行级别的进程。 然后,init 命令取消所有不应该运行在新级别上的进程,并启动所有应该运行在新级别上的进程。
在这些运行级别的每一级别上由 init 命令运行的进程定义在文件 /etc/inittab 之中。通过让 root 用户运行telinit 命令来改变运行级别,该命令链接到init 命令。该用户运行的init 命令向在系统启动时初始化的原始init 命令发送适当的信号。缺省运行级别可通过修改/etc/inittab 文件中 initdefault 项的运行级别来更改。
在维护运行级别, /dev/console 控制台终端对读写开放。提示输入 root 密码。当成功输入 root 用户密码时,su 被调用。有两种方法可以退出维护运行级别:
如果 shell 终止了,init 命令要求一个新的运行级别。

init(或telinit)命令可以用信号通知init 命令并强制其改变系统的运行级别。
在系统试图启动时,init 命令提示输入一个新运行级别(initdefault 为维护时)的明显失败的原因可能是终端控制台设备(/dev/console) 被转换到一个并非物理控制台的设备上。倘若如此,而您希望在物理控制台而非 /dev/console 上工作,可以通过按物理控制台设备上的 DEL(删除)键强制 init 命令转换到物理控制台。
当 init 命令提示输入一个新的运行级别,输入 0 到 9 中的任一位或以下任一字母 S、s、M 或m。如果输入的是 S 、s、M 或m,init命令以维护方式操作,其额外结果是:如果此前控制被强制转换到物理控制台,/dev/console 文件也被转换到该设备。init 命令生成一条消息到 /dev/console 文件事先已连接到的设备上。
如果您输入了 0 到 9 运行级别,init 命令进入相应的运行级别。init 命令拒绝任何其它输入并重新提示您输入正确值。 如果这是init 命令第一次进入任意运行级别而非维护级别,它搜索/etc/inittab 文件中的带boot 或 bootwait 关键字的条目。如果init 命令找到了这些关键字,它执行相应的任务,假如输入的运行级别与条目的运行级别相匹配的话。例如,如果init 命令找到 boot 关键字,它引导机器。系统的任意特定的初始化,诸如检测和安装文件系统,都发生在系统允许任何用户操作之前。然后init 命令扫描/etc/inittab 文件查找为该运行级别处理的所有条目。接着它继续 /etc/inittab 文件的正常处理。
运行级别 2 缺省定义为包含运行在多用户环境的所有终端进程和守护进程。在多用户环境中,/etc/inittab 文件被设置以使得init 命令为系统的每一终端创建进程。
对终端进程而言,shell 终止是因为一明确输入的文件结束符,或断开连接。当init 命令收到一个进程已中止的信号,它在 /etc/utmp 文件和 /var/adm/wtmp 文件之中记录该事实及其原因。/var/adm/wtmp 文件记录已启动的进程的历史。
要在 /etc/inittab 文件之中启动每一进程,init 命令等待其一后继过程停止,等待一电源故障信号 SIGPWR,或直到init 命令由init 或 telinit 命令发出以改变系统的运行级别。当上述三个条件之一发生时,init 命令重新检查/etc/inittab 文件。即使已经有新的条目添加到 /etc/inittab 文件,init 命令仍在等待三个条件之一的发生。为提供瞬时响应,请运行telinit -q 命令来重新检查/etc/inittab 文件。
如果 init 命令发现其连续在文件 /etc/inittab 中运行一个条目( 225 秒内超过 5 次),它假定在条目命令字符串中存在一个错误。然后它打印一个出错信息到控制台,并在系统出错日志中记录一个错误。发送该消息后,60 秒内该条目不运行。如果该错误继续发生,该命令将每 240 秒仅重新生成该条目 5 次。init 命令继续假定出错,直到该命令在时间间隔内 5 次不响应,或直到其收到一个用户的信号。init 命令仅在错误第一次出现时记录该错误。
当 telinit 命令请求init 命令改变运行级别,init 命令向当前运行级别内未定义的所有进程发送一个 SIGTERM信号。在以信号 SIGKILL 中止这些进程前,init 命令等待 20 秒。
如果 init 命令收到一个SIGPWR 信号,且不在维护方式下,它扫描 /etc/inittab 文件查找特定的电源故障条目。在任何其它进一步的进程运行之前,init 命令调用与这些条目关联的任务(如果运行级别允许的话)。按这个方法,无论何时系统遇到电源故障,init 命令都可以执行 清除和记录功能。需要注意的是,这些电源故障条目不应该使用最先初始化的设备。
环境
因为 init 命令是系统每个进程的终极祖先,系统的每一其它进程继承该init 命令的环境变量。作为其初始化序列的一部分,init 命令读/etc/environment 文件,并将该文件中发现的任一赋值复制到传递给其所有子进程的环境中。因为init 子进程在注册会话中不运行,它们不继承init 命令的 umask 设置。这些进程可以设置 umask 为任意它们所需要的值。/etc/inittab 文件中的由init 执行的命令使用init 的 ulimit 值而非 /etc/security/limits 中所给出的缺省值。结果为由命令行成功执行的命令在由init 调用时可能执行不正确。任何有特殊 ulimit 需要的命令应包含特定的操作以设置为所需要的ulimit 值。
示例
要请求 init 命令重新检查/etc/inittab 文件,输入:
telinit q
要请求 init 命令进入维护方式,输入:
telinit s

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:475593次
    • 积分:5528
    • 等级:
    • 排名:第4756名
    • 原创:20篇
    • 转载:398篇
    • 译文:0篇
    • 评论:29条
    最新评论