linuxlinux java 启动脚本本如何写

比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
Linux开机如何自动启动脚本
  通过现场对这次天津iptv demo项目的调测、对iptv这套系统有了更好的认识和理解、由于iptv本身需要安装许多服务、而现场实施中有没有把这些需要启动服务的脚本加入到开机自动运行中、如果重启之后需要手工开启许多服务、工作及以后的维护相对比较繁琐、特地总结了下下开机自动启动脚本所涉及的知识和方法、如下:
  1、相关基础知识点
  1)redhat的启动方式和执行次序是:
  加载内核
  执行init程序
  /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
  /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
  /etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
  /sbin/mingetty # 等待用户登录
  在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
  调入keymap以及系统字体
  启动swapping
  设置主机名
  设置NIS域名
  检查(fsck)并mount文件系统
  打开quota
  装载声卡模块
  设置系统时钟
  等等。
  /etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx从小到大来执行。(其中xx是数字、表示的是启动顺序)例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用 /etc/rc.d/rc3.d/下的脚本。
  值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。
  init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
  至此,linux的启动结束。
  2)init运行级别及指令
  一、什么是INIT:
  init是linux系统操作中不可缺少的程序之一。
  所谓的init进程,它是一个由内核启动的用户级进程。
  内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
  内核会在过去曾使用过init的几个地方查找它,它的正确位置(对linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
  二、运行级别
  那么,到底什么是运行级呢?
  简单的说,运行级就是当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。
  不同的运行级定义如下
  # 0 - 停机(千万不能把initdefault 设置为0 )
  # 1 - 单用户模式 # s init s = init 1
  # 2 - 多用户,没有 NFS
  # 3 - 完全多用户模式(标准的运行级)
  # 4 - 没有用到
  # 5 - X11 多用户图形模式(xwindow)
  # 6 - 重新启动 (千万不要把initdefault 设置为6 )
  这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)
  3):chkconfig 命令(redhat 操作系统下)
  不像DOS 或者 Windows,linux 可以有多种运行级。常见的就是多用户的2,3,4,5 ,很多人知道 5 是运行 X-Windows 的级别,而 0 就 是关机了。运行级的改变可以通过 init 命令来切换。例如,假设你要维护系统进入单用户状态,那么,可以使用 init 1 来切换。在 linux 的运行级的切换过程中,系统会自动寻找对应运行级的目录/etc/rc[0-6].d下的K 和 S 开头的文件,按后面的数字顺序,执行这 些脚本。对这些脚本的维护,是很繁琐的一件事情,linux 提供了chkconfig 命令用来更新和查询不同运行级上的系统服务。
  语法为:
  chkconfig ―― [name]
  chkconfig ――add name
  chkconfig ――del name
  chkconfig [――level levels] name
  chkconfig [――level levels] name
  chkconfig 有五项功能:添加服务,删除服务,列表服务,改变启动信息以及检查特定服务的启动状态。
  chkconfig 没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回 true,否则返回false. ――level 选项可以指定要查看的运行级而不一定是当前运行级。
  如果在服务名后面指定了on,off 或者 reset,那么 chkconfig 会改变指定服务的启动信息。on 和 off 分别指服务在改变运行级时的启动和停止。reset 指初始化服务信息,无论有问题的初始化脚本指定了什么。
  对于 on 和 off 开关,系统默认只对运行级 3,4, 5有效,但是 reset 可以对所有运行级有效。指定 ――level 选项时,可以选择特定的运行级。
  需要说明的是,对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init 不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。
  选项介绍:
  ――level levels
  指定运行级,由数字 0 到 7 构成的字符串,如:
  ――level 35 表示指定运行级3 和5.
  要在运行级别3、4、5中停运 服务,使用下面的命令:chkconfig ――level 345 nfs off
  ――add name
  这个选项增加一项新的服务,chkconfig 确保每个运行级有一项 启动(S) 或者 杀死(K) 入口。如有缺少,则会从缺省的init 脚本自动建立。
  ――del name
  用来删除服务,并把相关符号连接从 /etc/rc[0-6].d 删除。
  ――list name
  列表,如果指定了name 那么只是显示指定的服务名,否则,列出全部服务在不同运行级的状态。
  运行级文件
  每个被chkconfig 管理的服务需要在对应的init.d 下的脚本加上两行或者更多行的注释。
  第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 - 代替运行级。
  第二行对服务进行描述,可以用 跨行注释。
  例如,random.init 包含三行:
  # chkconfig:
  # description: Saves and restores system entropy pool for
  # higher quality random number generation.
  表明 random 脚本应该在运行级 2, 3, 4, 5 启动,启动优先权为20,停止优先权为 80.
  好了,介绍就到这里了,去自己目录下的/etc/rc.d/init.d 下的脚本吧。
  设置自启动服务:chkconfig ――level 345 nfs on
  2. 实例介绍:
  1、在linux下安装了apache 服务(通过下载二进制文件经济编译安装、而非rpm包)、apache 服务启动命令:
  /server/apache/bin/apachectl start .让apache服务运行在运行级别3下面。 命令如下:
  1)touch /etc/rc.d/init.d/apache
  vi /etc/rc.d/init.d/apache
  chown -R root /etc/rc.d/init.d/apache
  chmod 700 /etc/rc.d/init.d/apache
  ln -s /etc/rc.d/init.d/apache /etc/rc.d/rc3.d/S60apache
  #S 是start的简写、代表启动、K是kill的简写、代表关闭。60数字代表启动的顺序。(对于iptv系统而言、许多服务都是建立在启动的前提下才能够正常启动的、可以通过该数字就行调整脚本的启动顺序))
  apache的内容:
  #!/bin/bash
  #Start httpd service
  /server/apache/bin/apachectl start
  至此 apache服务就可以在运行级别3下 随机自动启动了。(可以结合chkconfig 对启动服务进行相应的调整)
[ 责任编辑:之极 ]
人与人的社交关系已经完全迁移到…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注ChinabyteLinux Shell脚本测试案例
Linux Shell脚本测试案例
  脚本1:为root用户编写登录欢迎脚本:  1、用vi命令在/root目录是新建一个脚本文件welcome.sh,内容如下:    2、使用chmod命令给welcome.sh文件增加执行(x)权限  3、修改/root/.bash_profile文件,在root用户每次登录系统时调用welcome.sh脚本程序  #vi /root/.bash_profile添加如下内容:    4、验证:使用root用户重新登录,验证欢迎脚本的输出信息  脚本2:编写脚本程序,用来启动、停止和显示系统服务状态:  1、用vi命令在/root/bin目录是新建一个脚本文件status用来查看crond服务的状态,内容如下:    设置x权限  脚本文件stop和start与status类似,稍作修改即可。  脚本3:编写运行状况监控脚本/opt/monitor.sh,用于记录CPU负载、内存和交换空间、磁盘空间、最近的用户登录情况等信息,以及当时的时间信息。  1、用vi命令在/opt目录是新建一个脚本文件monitor.sh,内容如下:  #!/bin/bash  mkdir -p /var/log/runrec  RecFile=&/var/log/runrec/running.today&  RecTime=`date &+&%Y-%m-%d %H:%M&`  LoadRec=`uptime`  MemRec=`free -m`  DiskRec=`df -hT`  LastLoginRec=`last -n 20`  echo&++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Record Time: $RecTime  cpu Load information:$LoadRec  Memory information:$MemRec  Disk Usage information:$DiskRec  Last login 20 users record:$LastLoginRec&&& $RecFile  2、使用chmod命令给monitor.sh文件增加执行(x)权限  3、测试脚本是否能正常运行及输出正确信息  4、设定计划任务,要求每隔15分钟执一次monitor.sh脚本,并确认crond服务已启动。  创建计划任务:  #crontab Ce & 内容如下  */15 * * * */opt/monitor.sh  查看crond服务状态并设置crond开机自动起动。  #service crondstatus  #chkconfig--level 35 crond on  脚本1:编写SHELL脚本监控主机  1、用vi命令在/root目录是新建一个脚本文件sysmon.sh,内容如下:    附:  a:使用df命令提取根分区的磁盘占用率:如下图所示:  使用df &-h命令查看磁盘分区的使用情况,其中根分区的已用空间是10%    用如下图中的命令可以过滤磁盘的已用空间    b:使用mpstat命令提取CPU使用率(要确保sysstat软件包已安装)。如下图所示:其中%idle表示CPU空闲时间百分比    用如下图中的命令可以得到CPU已用空间并赋值给变量CUG    c:使用free命令查看内存的使用情况。其中划红线的表示空余内存。    用如下图中的命令可以得到内存使用率并赋值给变量MUG    2、使用chmod命令给sysmon.sh文件增加执行(x)权限  3、测试sysmon.sh脚本的执行情况  a:配置DNS服务负责解析邮件服务器的MX和A记录  b:修改/etc/nf文件指向DNS服务器地址  c:配置邮件服务器  如果是postfix服务器,配置如下:    修改main.cf文件,修改后内容如下:    重启postfix服务。并发测试邮件。  d:确认有可用的邮件服务器,然后调低监控阈值,执行sysmon.sh脚本进行测试  e:查收名为的邮箱,确认警告邮件内容    邮件内容如下:    4、设置crontab计划任务,每隔半小调用一次sysmon.sh脚本程序    重新启动crond服务。  脚本2:编写SHELL脚本(mkbak.sh)提示用户指定备份目录的路径,若目录已存则显示提示信息后跳过,否则显示相应信息后创建该目录。    脚本3:编写脚本程序(chkdbsvr.sh)用于每隔5分监视一次系统服务mysqld的运行状态,若发现mysqld进程已经停止,则在/var/log/messages文件中追加写入日志信息(包括当时时间),并重启mysqld服务;否则不进行任何操作    脚本4:编写脚本程序用于监视系统服务httpd的运行状态,要求如下  当服务状态失常时在&/var/log/htmon.log&文件中记入日志信息。  自动将状态失常的httpd服务重新启动。若重启httpd服务失败,测尝试重新启动服务器主机  结合crond计划任务,每周一至周五每隔15分钟执行一次监测任务  1、在/opt目录中创建脚本htmon.sh,脚本内容如下  #! /bin/bash  /sbin/service httpdstatus && /dev/null  if [ $? -ne 0 ] ; then  echo &`date`& && /var/log/htmon.log  /sbin/service httpd restart  /sbin/service httpd status &&/dev/null  if [ $? -ne 0 ] ; then  /sbin/chkconfig --level 2345 httpd on  /sbin/shutdown -r now  fi  fi  2、创建crontab计划任务  */15 * * * * /opt/htmon.sh  脚本1:编写一个名为getarp.sh的脚本,记录局域网中各个主机的MAC地址。保存到/etc/ether文件中,若此文件已存在,应先进行备份。第行一条记录,第1列为IP地址,第2列为对应的MAC地址。  分析:  假定要扫描的网段是192.168.4.0,将192.168.4.赋值给变量NADD,作为检测地址的前缀  使用”arping &-c 2 -w 1 被检测主机的IP”命令发送ARP请求,记录MAC地址    用while循环语句检测目标主并记录MAC地址,这里检测的主机地址为2~3  1、用vi创建一个名为getarp.sh脚本,内容如下:  #!/bin/bash  NADD=&192.168.4.&  FILE=&/etc/ethers&  [-f $FILE ] && /bin/cp -f $FILE $FILE.old  HADD=1  while[ $HADD -lt 4 ]  do  arping -c 2 -w 1 ${NADD}${HADD} &&/dev/null  if [ $? -eq 0 ] ; then  arp -n | grep ${NADD}${HADD} | awk '{print$1,$3}' && $FILE  fi  let HADD++  done  2、给脚本getarp.sh增加x权限  3、执行脚本,查看检测到的MAC信息  脚本2:编写一个脚本scanhost.sh,检查有哪些主机开启了匿名FPT服务,扫描对象为/etc/ethers文件中的所有IP地址,扫描的端口号为21  环境描述:假定192.168.4.2主机为匿名访问的FTP。 192.168.4.3非匿名访部的FTP。  创建扫描文件/etc/ethers,内容如下:    这里采用wget下载工具:wget ftp://IP/  1、用vi创建一个名为scanhost.sh脚本,内容如下:  #!/bin/bash  TARGET=$(awk'{print $1}' /etc/ethers)  echo&follow is anonymous FTP server:&  forIP in $TARGET  do  wget CT 3 &-t 3 ftp://$IP/ && /dev/null  if [ $? -eq 0 ] ; then  echo $IP  fi  done  参数提示:-T 连接超时时间;-t 连接重试次数  2、给脚本getarp.sh增加x权限  3、执行脚本,查看扫描到的信息  脚本3:计算/etc/目录中所有nf配置文件所占用的总空间大小  用vi创建一个名为confsize.sh脚本,内容如下:  #!/bin/bash  sizenums=$(ls-l $(find /etc/ -type f -a -name nf) | awk '{print $5}')  total=0  fori in $sizenums  do  total=$(expr $total + $i)  done  echo&total size of conf files: $total bytes.&  脚本4:编写一个脚本chkfileown.sh,对于使用bash作为登录shell的系统中,检查他们在/opt目录中的文件数量并列出具体的数值及对应的用户账户  1、用vi创建一个名为chkfileown.sh脚本,内容如下:  #!/bin/bash  DIR=&/opt/&  validusers=$(grep&bash$& /etc/passwd | awk -F: '{print $1}')  forusername in $validusers  do  num=$(find $DIR -user $username | wc -l)  echo &$username have $num files.&  done  2、给脚本getarp.sh增加x权限  3、执行脚本,查看执行后的信息(注:/opt目录下若没有任何文件,可事先创建一些测试文件)  脚本5:编写脚本用于批量添加用户,要求如下:  要求提供交互功能,当管理员执行该脚本时,可以根据提示指定需添加的用户数量(少于100)、用户名前缀、并能够设置这些用户账户的失效时间,初始密码。  用户名编号统一使用两位数,如使用”01”、”02”、”03”的形式,而不是”1”、”2”、”3”的形式。  编写对应的批量删节除用户脚本,要能够通过命令行参数指定用户名前缀,执行脚本后删除所有使用了该前缀的用户账户,但要防止删除root用户。  批量添加用户脚本:  1、批量添加用户脚本myuadd.sh内容如下:  #!/bin/bash  read-p &input nu &1-99&:& nu  read-p &input name:& name  read-p &input date &YYYY-MM-DD&:& date  read-p &input password:& password  a=1  if[ $nu -lt 100 ]  then  while[ $a -le $nu ]  do  if [ $a -lt 10 ]  then  useradd -e $date&$name&0&$a&  echo &$password& | passwd--stdin &$name&0&$a& &&/dev/null  else   useradd -e $date&$name&&$a&  echo &$password& | passwd--stdin &$name&&$a& &&/dev/null  fi  a=`expr$a + 1`  done  fi  2、给脚本myuadd.sh增加x权限  3、执行脚本myuadd.sh,添加用户  4、验证结果:查看/etc/passwd文件是否添了新用户  批量删除用户脚本:  1、批量删除用户脚本myudel.sh内容如下:  #!/bin/bash  if[ $# -le 0 ] ; then  echo &error:the prefix of users has notbe specified.&  echo &usage:$0 nameprefix&  exit 1  fi  tarjcvf /root/f.tar.gz /etc/passwd /etc/shadow /etc/group &&/dev/null  tobedel=`grep&$1& /etc/passwd | cut -d &:& -f 1 | grep -v&root&`  foru in $tobedel  do  userdel -r $u && /dev/null  done  2、给脚本myudel.sh增加x权限  3、执行脚本myudel.sh,删除用户。如myudel.shcaiwu03或myudel.sh caiwu  4、验证结果:查看/etc/passwd文件中已删除的用户是否还存在。  附:  我们可以用env或export命令查看环境变量,使用set命令查看所有变量(包括环境变量和自定义变量),使用unset命令删除变量  LINUX系统中大多数版本都有随机数生成器,就是/dev/random文件。可以通过这个随机数文件相关的系统环境变量$RANDOM来随机取得随机数。在BASH环境下,这个RANDOM变量的内容介于0――32767之间,(man bash,搜索 RANDOM 可以看到说明)所以,只要echo $RANDOM时,系统就会主动随机取出一个介于0――32767的数值。例如要想0-9之间的随机数时,可以用declare声明数值类型    或    
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&写一个脚本auto_coreseek.sh:
#chkconfig:
#description:auto_coreseek
/usr/local/coreseek/bin/searchd
放到/etc/init.d/auto_coreseek.sh
然后chmod +x /etc/init.d/auto_coreseek.sh
然后加到开机启动中:
chkconfig --add auto_coreseek.sh
然后研究下这都是些毛意思。
chkconfig有几个等级:
0:表示关机
1:表示单用户模式
2:表示无网络链接多用户命令行模式
3:表示有网络链接多用户命令行模式
4:表示不可用情况
5:表示带图形界面的多用户模式
6:表示重新启动
所以chkconfig:2345就代表在2345的等级下启动这个服务
后面的80 90分别是启动优先级和关闭优先级
说说程序的优先级,优先级也很好理解,就是程序被CPU执行的先后顺序,此值越小有限级别越高。所以这里的启动优先级和关闭优先级的意思就是启动脚本这个进程的优先级,和关闭脚本这个进程的优先级。Linux 的启动流程 - 文章 - 伯乐在线
& Linux 的启动流程
半年前,我写了,探讨BIOS和主引导记录的作用。
那篇文章不涉及操作系统,只与主板的板载程序有关。今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。
这个部分比较有意思。因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。
我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是发行版,因为我对其他发行版不够熟悉。
第一步、加载内核
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
以我的电脑为例,/boot 目录下面大概是这样一些文件:
$ ls /boot
config-3.2.0-3-amd64
config-3.2.0-4-amd64
initrd.img-3.2.0-3-amd64
initrd.img-3.2.0-4-amd64
System.map-3.2.0-3-amd64
System.map-3.2.0-4-amd64
vmlinuz-3.2.0-3-amd64
vmlinuz-3.2.0-4-amd64
1234567891011
$ ls /boot&config-3.2.0-3-amd64config-3.2.0-4-amd64grubinitrd.img-3.2.0-3-amd64initrd.img-3.2.0-4-amd64System.map-3.2.0-3-amd64System.map-3.2.0-4-amd64vmlinuz-3.2.0-3-amd64vmlinuz-3.2.0-4-amd64
第二步、启动初始化进程
内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。
由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。
第三步、确定运行级别
许多程序需要开机启动。它们在Windows叫做”服务”(service),在Linux就叫做”“(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做”“(runlevel)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。
Linux预置七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。
init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。如果你打开它,可以看到第一行是这样的:
id:2:initdefault:
id:2:initdefault:
initdefault的值是2,表明系统启动时的运行级别为2。如果需要指定其他级别,可以手动修改这个值。
那么,运行级别2有些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?……回答是每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。
/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
/etc/rc0.d/etc/rc1.d/etc/rc2.d/etc/rc3.d/etc/rc4.d/etc/rc5.d/etc/rc6.d
上面目录名中的”rc”,表示run command(运行程序),最后的d表示directory(目录)。下面让我们看看 /etc/rc2.d 目录中到底指定了哪些程序。
/etc/rc2.d
S13rpcbind
S14nfs-common
S16binfmt-support
S16rsyslog
S17apache2
123456789101112
$ ls&&/etc/rc2.d&READMES01motdS13rpcbindS14nfs-commonS16binfmt-supportS16rsyslogS16sudoS17apache2S18acpid...
可以看到,除了第一个文件README以外,其他文件名都是”字母S+两位数字+程序名”的形式。字母S表示Start,也就是启动的意思(启动脚本的运行参数为start),如果这个位置是字母K,就代表Kill(关闭),即如果从其他运行级别切换过来,需要关闭的程序(启动脚本的运行参数为stop)。后面的两位数字表示处理顺序,数字越小越早处理,所以第一个启动的程序是motd,然后是rpcbing、nfs……数字相同时,则按照程序名的字母顺序启动,所以rsyslog会先于sudo启动。
这个目录里的所有文件(除了README),就是启动时要加载的程序。如果想增加或删除某些程序,不建议手动修改 /etc/rcN.d 目录,最好是用一些专门命令进行管理(参考和)。
第四步、加载开机启动程序
前面提到,七种预设的”运行级别”各自有一个目录,存放需要开机启动的程序。不难想到,如果多个”运行级别”需要启动同一个程序,那么这个程序的启动脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修改启动脚本,岂不是每个目录都要改一遍?
Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。
下面就是链接文件真正的指向。
$ ls -l /etc/rc2.d
S01motd -& ../init.d/motd
S13rpcbind -& ../init.d/rpcbind
S14nfs-common -& ../init.d/nfs-common
S16binfmt-support -& ../init.d/binfmt-support
S16rsyslog -& ../init.d/rsyslog
S16sudo -& ../init.d/sudo
S17apache2 -& ../init.d/apache2
S18acpid -& ../init.d/acpid
123456789101112
$ ls -l /etc/rc2.d&READMES01motd -& ../init.d/motdS13rpcbind -& ../init.d/rpcbindS14nfs-common -& ../init.d/nfs-commonS16binfmt-support -& ../init.d/binfmt-supportS16rsyslog -& ../init.d/rsyslogS16sudo -& ../init.d/sudoS17apache2 -& ../init.d/apache2S18acpid -& ../init.d/acpid...
这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。比如,我要重启Apache服务器,就运行下面的命令:
$ sudo /etc/init.d/apache2 restart
$ sudo /etc/init.d/apache2 restart
/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。
第五步、用户登录
开机启动程序加载完毕以后,就要让用户登录了。
一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh登录
(3)图形界面登录
这三种情况,都有自己的方式对用户进行认证。
(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
(2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。
第六步、进入 login shell
所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell。
Debian默认的shell是,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。
(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。
~/.bash_profile
~/.bash_login
~/.profile
~/.bash_profile~/.bash_login~/.profile
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。
(2)ssh登录:与第一种情况完全相同。
(3)图形界面登录:只加载 /etc/prfile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。
第七步,打开 non-login shell
老实说,上一步完成以后,Linux的启动过程就算结束了,用户已经可以看到命令行提示符或者图形界面了。但是,为了内容的完整,必须再介绍一下这一步。
用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile和.profile等配置文件。
non-login shell的重要性,不仅在于它是用户最常接触的那个shell,还在于它会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。
你也许会问,要是不进入 non-login shell,岂不是.bashrc就不会运行了,因此bash 也就不能完成定制了?事实上,Debian已经考虑到这个问题了,请打开文件 ~/.profile,可以看到下面的代码:
if [ -n "$BASH_VERSION" ]; then
  if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
fi&span style="font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', font-style:"&  &/span&
if [ -n "$BASH_VERSION" ]; then  if [ -f "$HOME/.bashrc" ]; then    . "$HOME/.bashrc"  fifi&span style="font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', font-style:"&  &/span&
上面代码先判断变量 $BASH_VERSION 是否有值,然后判断主目录下是否存在 .bashrc 文件,如果存在就运行该文件。第三行开头的那个点,是source命令的简写形式,表示运行某个文件,写成”source ~/.bashrc”也是可以的。
因此,只要运行~/.profile文件,~/.bashrc文件就会连带运行。但是上一节的第一种情况提到过,如果存在~/.bash_profile文件,那么有可能不会运行~/.profile文件。解决这个问题很简单,把下面代码写入.bash_profile就行了。
if [ -f ~/.profile ]; then
  . ~/.profile
if [ -f ~/.profile ]; then  . ~/.profilefi
这样一来,不管是哪种情况,.bashrc都会执行,用户的设置可以放心地都写入这个文件了。
Bash的设置之所以如此繁琐,是由于历史原因造成的。早期的时候,计算机运行速度很慢,载入配置文件需要很长时间,Bash的作者只好把配置文件分成了几个部分,阶段性载入。系统的通用设置放在 /etc/profile,用户个人的、需要被所有子进程继承的设置放在.profile,不需要被继承的设置放在.bashrc。
顺便提一下,除了Linux以外, Mac OS X 使用的shell也是Bash。但是,它只加载.bash_profile,然后在.bash_profile里面调用.bashrc。而且,不管是ssh登录,还是在图形界面里启动shell窗口,都是如此。
[1] Debian Wiki,
[2] Debian Wiki,
[3] Debian Administration,
[4] Debian Admin,
[5] Linux Information Project (LINFO),
[6] LinuxQuestions.org,
[7] Dalton Hubble,
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线

我要回帖

更多关于 linux开机启动脚本 的文章

 

随机推荐