在服务器的市场上,window由于其危险性而不被看好linux 关机前执行,于此相反的是linux则是很受欢迎!好多小型的应用linux定时器,应用系统都布署在性能比较稳定的linux系统上。下边谈谈linux的开关机:
linux下有关死机重启的主要有:shutdown、reboot、halt、poweroff、telinit、init.它们
都可以达到死机或重启的目的,而且每位的工作流程并不一样.它们都由软件包sysvinit形成,
你可以从网上下载它的源码来剖析各个命令的流程,同时,sysvinit也包含了与登录等有关的命令.
下边剖析sysvinit-2.86软件包的源码,同时参考它们的指南来对它们深入了解.
1、从Makefile可以晓得,里面的命令并不都是相互独立的,poweroff、reboot是halt的链接,telinit
是init的链接.
ln-sfhalt$(ROOT)/sbin/reboot
ln-sfhalt$(ROOT)/sbin/poweroff
ln-sfinit$(ROOT)/sbin/telinit
在终端输入
#ls-l/sbin/poweroff
#ls-l/sbin/reboot
#ls-l/sbin/telinit
也可以听到里面的结果.
2、halt.
参数说明:
[-n]避免sync系统调用﹐它用在用fsck修复根分区以后﹐以制止内核用老版本的超级块
〔superblock〕覆盖修复过的超级块.
[-w]并不是真正的重启或死机﹐只是写wtmp〔/var/log/wtmp〕纪录.
[-d]不写wtmp纪录〔已包含在选项[-n]中〕.
[-f]没有调用shutdown而强制死机或重启(halt/reboot).
[-h]使硬碟处于standby模式.
[-i]关闭所有的网路插口.
[-p]该选项为缺省选项.就是死机时调用poweroff.
后面早已晓得,poweroff、reboot是halt的链接,halt会首先判定用户执行的是否是poweroff和reboot中的一个.倘若执行的是poweroff,则等效于-p参数,执行reboot的情况将在下边说明.
解析命令行参数后,会调用geteuid系统调用判定是否为root用户,倘若为普通用户,halt退出.
接出来即是针对不同的参数执行不同操作的过程.首先是不带任何参数的情况(或则参数中不含-w
或-f),halt会通过INIT_VERSION和RUNLEVEL环境变量,或则读取/var/run/utmp文件(通过linux
的用户组函数)获得系统所在的运行级.若果系统不在0和6运行级,会判定执行的是否reboot,如
果用户执行reboot,则调用"shutdown-r";否则执行"shutdown-h".
其它情况下,都是通过调用reboot系统调用来达到死机或重启的目的,有关reboot系统调用,可以
使用man2reboot命令查看它的指南.假如开启了CTRL-ALT-DEL,同时按下CTRL-ALT-DEL时,会调
用reboot(RB_ENABLE_CAD)重启;假如用户执行的是poweroff命令,会调用reboot(RB_POWER_OFF)
死机.
根据默认设置,/etc/inittab文件指定你的系统可在控制台使用CTRL-ALT-DEL键组合来关掉并重启
系统.假如你想完全严禁这个功能,须要将/etc/inittab文件中下边一行注释掉:
ca:12345:ctrlaltdel:/sbin/shutdown-t1-a-rnow
里面命令里的-a选项通知shutdown命令找寻/etc/shutdown.allow文件,并把CTRL-ALT-DEL的功能限
定给个别用户.详见shutdown命令部份.
3、运行级.
所谓运行级别是一种系统软件环境配置,在此特定的环境中只容许某一组选取的进程存在.init给
不同的运行级别派生的进程在/etc/inittab文件中定义.Init可以启动到8个不同的运行级别上:
0-6和S或s.运行级别可以由超级用户通过telinit命令来转换,此命令可以将转换讯号传递
给init,告诉它切换到那个运行级别.
运行级别0,1,和6为系统保留的专用运行级别.运行级别0拿来死机,运行级别6拿来重启,
运行级别1拿来使计算机步入单用户模式.运行级别S不是给我们直接使用的,更多是为步入运
行级别1时运行个别可执行时被调用.
运行级7-9似乎在文档中说明,但也可以使用.不使用它们的诱因只是由于"传统"Unix变种不使
用这种运行级别.另外,运行级别S和运行级别s实际上是相同的,它们只是系统内同一运行级
别的两个不同的别称而己.
可以使用sysvinit包的runlevel命令获得系统当前的运行级,不用加任何参数,直接在终端执行
runlevel即可(也是通过用户组相关的函数读取/var/run/utmp文件获得).下边是几个运行级的简
单介绍:
#0-死机(千万不要把initdefault设置为0)
#1-单用户模式
#2-多用户,并且没有NFS
#3-完全多用户模式
#4-没有用到
#5-X11
#6-重启(千万不要把initdefault设置为6)
4、shutdown.
shutdown命令可以安全地关掉或重启Linux系统,它在系统关掉之前给系统上的所有登陆用户提示
一条警告信息.该命令还容许用户指定一个时间参数,可以是一个精确的时间,也可以是从现今开
始的一个时间段.所有进程都将接收到SIGTERM讯号.这可以使vi等程序有时间将处于编辑状态
的文件进行储存,短信和新闻程序进程则可以将所有缓冲池内的数据进行适当的清理等等.
shutdown通过通知init进程,要求它改换运行级别来实现.运行级别0拿来关掉系统,运行级
别6拿来重启系统,运行级别1拿来使系统步入执行系统管理任务状态,假如没有给出-h或-r
参数时,这是shutdown命令的默认工作状态.系统执行该命令后,会手动进行数据同步的工作.
shutdown[-akrhHPfnc][-tsecs]time[warningmessage]
参数说明:
[-a]使用/etc/showdown.allow文件.
[-tsec]通知init在转换到其它运行级别前,发送警告(warning)讯号后延时(sec)秒数后
再发送关掉(kill)讯号.
[-r]重启.
[-k]并不真正死机﹐只是送警告讯号给每个登陆者〔login〕.
[-h]死机后关掉电源〔halt〕.
[-n]不用init﹐而是自己来死机.不鼓励使用这个选项﹐并且该选项所形成的后果常常不
总是你所预期得到的.
[-c]取消目前正在执行的shutdown.所以这个选项其实没有时间参数﹐并且可以输入一个
拿来解释的讯息﹐而这信息将会送到每个使用者.
[-f]重启〔reboot〕时忽视fsck.
[-F]重启〔reboot〕时逼迫fsck.
time死机时间.整个参数是必须的.格式可以有好多种.首先,可以是hh:mm格式的绝对
时间,其中hh指的是小时(一到二位数),mm指的是分钟(二位数).第二种是+m格式,其中
m指的是等待的分钟数.now是+0的别称.
warning-message发送给所有用户的消息.
与halt一样,shutdown调用getuid系统调用判定是否为root用户,倘若为普通用户,调用exit(1)
退出.
接出来会解析命令行参数.假如带-a参数,会检查是否存在/etc/shutdown.allow文件.接出来它比
较文件中的登陆名与虚拟终端的登入用户列表(在/var/run/utmp).只有当授权的用户之一或则
root登陆了,它才能继续.否则,它会在终端输出shutdown:noauthorizeduserslogged
in
/etc/shutdown.allow的格式是每行一个用户名.容许出现空行和注释行.假如
/etc/shutdown.allow不存在,-a参数将被忽视.
执行shutdown时,会形成/var/run/shutdown.pid文件,上面放的是运行shutdown的进程pid,带有
-c参数时,会检查这个pid,倘若大于0则在终端输出错误信息:
shutdown:cannotfindpidofrunningshutdown
否则杀害shutdown进程.
带有-f参数时,会创建/fastboot文件,这个文件在系统重启时会被测量到.启动脚本rc会检查是否
存在这个文件,假如有,表示系统正常关掉,就不再执行fsck,然后,启动进程删掉/fastboot.
带有-F参数时,会创建/forcefsck文件,这个文件再系统重启时会被测量到.启动脚本rc会检查是
否存在这个文件,假如有,就执行fsckforce,这时,虽然正常卸载的文件系统也会被测量.以后,
启动进程删掉/forcefask.
假如有使用time参数,shutdown会创建/etc/nologin文件,严禁新用户登录,除非shutdown向init
发讯号前意外中止.在调用init改变运行级前会删掉这个文件.
5、init.
Init是所有进程的父进程.它的首要任务是从一个储存在文件/etc/inittab上面的脚本里创建进
程.
init通过检测自己的进程号来判定自己是init还是telinit;真的init的进程号永远都是1.
假如init发觉执行的是telinit,它会调用函数
inttelinit(char*progname,intargc,char**argv);
执行telinit的操作.倘若执行的是真正的init,它会调用函数
intinit_main();
步入主循环.
倘若执行init,用法是:
init[-a][-s][-b][-zxxx][0123456s]
倘若执行的是telinit,用法是:
telinit[-tsec][0123456sSQqabcUu]
但执行telinit时,telinit函数依然通过向initfifo(/dev/inidctl)写入命令的形式通知init
执行相应的操作.
参数说明:
0,1,2,3,4,5,6将运行级别切换到指定的运行级别.
a,b,c只运行这些/etc/inittab文件中运行级别是a,b或c的记录.
Q,q通知init重新检查/etc/inittab文件.
S,s将运行级别切换到单用户模式下.
U,u手动重启(保留状态),此操作不会对文件/etc/inittab进行重新检查.执行此操作
时,运行级别必须处在Ss12345之一,否则,该恳求将被忽视.
-tsec告诉init两次发送SIGTERM和SIGKILL讯号的时间间隔.默认值是5秒.
init会对终端进行一些默认的设置,这儿有一些快捷键可以使用,例如:
ctrl+d退出登入,等效于logout命令
ctrl+c杀害应用程序
ctrl+q
ctrl+s暂停应用程序运行,可用ctrl+q回复运行
ctrl+z挂起应用程序,此时ps显示的该进程状态变为T
ctrl+x
接出来,init将查找/etc/inittab文件,瞧瞧是否有类型为initdefault的记录.initdefault记
录决定系统初始运行级别.若果没有这条记录(或则根本就没有/etc/inittab),这么,必须在
系统控制台输入想要步入的运行级别.之后,init会解析/etc/inittab文件中的各个条目并执行相
应操作.
运行级别S或s把系统带入单用户模式,此模式不须要/etc/initttab文件.单用户模式中,
/sbin/sulogin会在/dev/console这个设备上打开.
当第一次步入多用户模式时,init会执行boot和bootwait记录便于在用户可以登陆之前挂载文
件系统.之后再执行相应指定的各进程.
当启动一个新的进程时,init会检测是否存在/etc/initscript文件.假如存在该文件,则使用
该脚本来启动该进程.
若果系统中存在文件/var/run/utmp和/var/log/wtmp,这么当每位子进程中止时,init会将终
止信息和缘由记录进这两个文件中.
当init启动了所有指定的子进程后,它会不断地探测系统进程情况,如:它的某个子进程被中止、
电源失效、或由telinit发出的改变运行级别的讯号.当它接受到以上的那些讯号之一时,它会自
动重新扫描/etc/inittab文件,并执行相应操作.所以,新的记录可以随时加入到此文件中.而且,init一直等待系统发出了上述讯号.在更新了各类系统文件后,假如你希望得到即时的更新,
你可以使用telinitQ或q命令来唤起init让它即刻重新检查/etc/inittab文件.
当init得到更新运行级别的恳求,init会向所有没有在新运行级别中定义的进程发送一个警告信
号SIGTERM.在等待5秒钟以后,它会发出强制中断所有进程的运行的讯号SIGKILL.注意,init
假定所有的这种进程(包括它们的后代)都一直在init最初创建它们的同一进程组里.假如有任
何进程改变了它们的进程组,这么它就收不到这种讯号.这样的进程,你须要分别进行手工的中止.
6、inittab.
/etc/inittab定义了系统缺省运行级别,系统步入新运行级别须要做哪些.inittab文件的格式:
id:runlevel:action:process
id,拿来惟一标志表项.它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty
的编号相同,否则getty程序将不能正常工作.
runlevel,是init所处于的运行级别的标示,通常使用0-6以及S或s,也可以是空,空则代表运行级
别0~6.当恳求init改变运行级别时,这些runlevel数组中不包括新运行级别的进程将收到SIGTERM
警告讯号,但是最后被杀害;只有a、b、c启动的命令外(a、b、c不是真正的运行级别).
action,告诉init执行的动作,即怎样处理process数组指定的进程.action数组容许的值及对应的
动作分别为:
1)respawn:假如process数组指定的进程没有运行,则启动该进程,init不等待处理结束,
而是继续扫描inittab文件中的后续进程,当这样的进程中止时,init会重新启动它,假如这样的进
程早已运行,则哪些也不做.
2)wait:启动process数组指定的进程,并等到处理结束才去处理inittab中的下一记录项.
3)once:启动process数组指定的进程,不等待处理结束就去处理下一记录项.当这样的进
程中止时,也不再重新启动它,在步入新的运行级别时,假如这样的进程仍在运行,init也不重新
启动它.
4)boot:只有在系统启动时,init才处理这样的记录项,启动相应进程,并不等待处理结
束就去处理下一个记录项.当这样的进程中止时,系统也不重启它.
5)bootwait:系统启动后,当第一次从单用户模式步入多用户模式时处理这样的记录项,
init启动这样的进程,但是等待它的处理结束,之后再进行下一个记录项的处理,当这样的进程终
止时,系统也不重启它.
6)powerfail:当init接到断电的讯号(SIGPWR)时,处理指定的进程.
7)powerwait:当init接到断电的讯号(SIGPWR)时,处理指定的进程,但是等到处理结束
才去检测其他的记录项.
8)off:倘若指定的进程正在运行,init就给它发SIGTERM警告讯号,在向它发出讯号SIGKILL
强制其结束之前等待5秒,假如这样的进程不存在,则忽视这一项.
9)ondemand:功能通respawn,不同的是,与具体的运行级别无关,只用于runlevel数组是
a、b、c的这些记录项.
10)sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对个别设备的初始
化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init须要等待进程运行结
束后才继续.
11)initdefault:指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,
假如rstate数组指定了多个运行级别,其中最大的数字是默认的运行级别,倘若runlevel数组是空
的,init觉得数组是0123456,于是步入级别6,这样便身陷了一个循环,倘若inittab文件中没有包
含initdefault的记录项,则在系统启动时恳求用户为它指定一个初始运行级别.
process,该数组中进程可以是任意的守侯进程、可执行脚本或程序,前面可以带参数.
7、sysvinit包的其它工具.
pidof,是killall5的链接,获得一个正在运行的进程的id.运行时前面跟进程的名叫做为参数.
last,显示近来登陆的用户列表.在指定了用户名和终端名的情况下,last只显示符合这种参数的
记录.终端的名子可以缩写,因而last0等同于lasttty0.每次系统重新启动时,虚用户reboot
就会被记录到日志中.所以lastreboot会列举自日志文件创建以来的所有重新启动的日志记录.
mountpoint,检查一个目录是否是一个挂载点.
mesg,控制其他人对终端的访问.
再把命令重新表述一遍:
重启命令:
1、reboot
2、shutdown-rnow立即重启(root用户使用)
3、shutdown-r10过10分钟手动重启(root用户使用)
4、shutdown-r20:35在时间为20:35时侯重启(root用户使用)
假如是通过shutdown命令设置重启的话linux 关机前执行脚本,可以用shutdown-c命令取消重启
死机命令:
1、halt立即死机
2、poweroff立即死机
3、shutdown-hnow立即死机(root用户使用)
4、shutdown-h1010分钟后手动死机
假如是通过shutdown命令设置死机的话linux格式化硬盘,可以用shutdown-c命令取消重启
本文原创地址://q13zd.cn/lxtkgjmlxjsr.html编辑:刘遄,审核员:暂无