LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1622|回复: 9

ubuntu9.10这几个目录下的启动脚本都有些什么作用?

[复制链接]
发表于 2010-1-15 17:10:11 | 显示全部楼层 |阅读模式
ubuntu9.10
一。ubutnu9.10启动过程涉及到哪些目录下载脚本?
二。这几个目录下的脚本,每个目录下都有N个脚本,这些脚本与启动有什么关系,谁可详细说说?
哪有这方面的中文资料。

/etc/init.d/
/etc/rc?.d/
发表于 2010-1-15 20:01:06 | 显示全部楼层
一. 有/etc/rc?.d  和 /etc/rc.local
二. * /etc/init.d 习惯上用来放置启动脚本而已,系统不会自动去执行它们,你可以手工执行,比如你想手工启动apache2,那就执行/etc/init.d/apache2 start
     * /etc/rc?.d 里的东西才是系统启动时要查看启动脚本的地方,那里有很多个/etc/rc?.d文件夹,那个"?"的地方表示的是你启动系统时要让它进入那个level, 现在有这么几个level: "1" 表示单用户模式, "2"-"5" 是多用户模式, "6"是重启, "0"是关机. 你指定机器启动进入哪个level, 它就会到相应的文件夹里查看启动脚本. 比如你让系统进入level 3, 那么系统就会进入/etc/rc3.d里查看启动脚本, 其它文件夹里的系统是不会去看的.
    怎么决定让系统进入哪个level呢?如果你的系统已经启动,那简单,只要执行"init $level", $level 代表你指定的level. 如果你刚按下电脑电源,你当然是没法执行这个命令的,这时系统会进入它自己默认的level, 这个值在/etc/inittab里指定,这个文件里有这么几行:
    # The default runlevel.
    id:2:initdefault:
里面的2就是默认的level. 你也可以把这个值改成你想要的值(0-6), 当然,你不想郁闷的话,就别把它改成0或者6. 哈哈

    在/etc/rc?.d文件夹里的启动脚本一般来说是一个symlink, 指向它在/etc/init.d文件夹里的真实文件(规范来说是这样,不一定非要这样,你理解好以后随便你怎么弄都可以), 它的文件名是有格式的:
      S??script-name  或者 K??script-name
     得对这个格式作个说明: "S"表示系统启动的时候会去启动这个脚本; "K"表示系统启动的时候不会启动这些脚本; "??"代表2位数字, 它用来决定脚本启动的优先级(顺序), 数字越小, 越早启动, 反之, 当关闭系统的时候,也要杀掉这些脚本, 那顺序就是倒过来了,数字越大,越早被杀. "script-name"就是脚本的名字了, 一般来说它跟它在/etc/init.d里的真实脚本名字是一样的(前面说过,不一定非得这么做).
举个例子吧, S22apache2 和 S25postfix, 系统启动的时候就会自动这么做: 先启动apache2, 然后是postfix. 如果你不想让apache2自动启动, 你可以到相应的/etc/rc?.d里把S22apache2删掉,或者把S22apache2名字改为K22apache2

    当rc?.d里的脚本启动完以后,系统才会去启动/etc/rc.local里指定的东西.还有啥不明白的不?
回复 支持 反对

使用道具 举报

发表于 2010-1-15 22:34:29 | 显示全部楼层
这是 lfs 的 rc 脚本,虽然不具普遍性,但绝对是标准做法

只看注释,作用可见一斑:
  1. #!/bin/sh
  2. ########################################################################
  3. # Begin $rc_base/init.d/rc
  4. #
  5. # Description : Main Run Level Control Script
  6. #
  7. # Authors     : Gerard Beekmans  - gerard@linuxfromscratch.org
  8. #
  9. # Version     : 00.00
  10. #
  11. # Notes       :
  12. #
  13. ########################################################################
  14. . /etc/sysconfig/rc
  15. . ${rc_functions}
  16. # These 3 signals will not cause our script to exit
  17. # Attempt to stop all service started by previous runlevel,
  18. # and killed in this runlevel
  19. #Start all functions in this runlevel
复制代码


全部脚本
  1. #!/bin/sh
  2. ########################################################################
  3. # Begin $rc_base/init.d/rc
  4. #
  5. # Description : Main Run Level Control Script
  6. #
  7. # Authors     : Gerard Beekmans  - gerard@linuxfromscratch.org
  8. #
  9. # Version     : 00.00
  10. #
  11. # Notes       :
  12. #
  13. ########################################################################
  14. . /etc/sysconfig/rc
  15. . ${rc_functions}
  16. # This sets a few default terminal options.
  17. stty sane
  18. # These 3 signals will not cause our script to exit
  19. trap "" INT QUIT TSTP
  20. [ "${1}" != "" ] && runlevel=${1}
  21. if [ "${runlevel}" = "" ]; then
  22.         echo "Usage: ${0} <runlevel>" >&2
  23.         exit 1
  24. fi
  25. previous=${PREVLEVEL}
  26. [ "${previous}" = "" ] && previous=N
  27. if [ ! -d ${rc_base}/rc${runlevel}.d ]; then
  28.         boot_mesg "${rc_base}/rc${runlevel}.d does not exist." ${WARNING}
  29.         boot_mesg_flush
  30.         exit 1
  31. fi
  32. # Attempt to stop all service started by previous runlevel,
  33. # and killed in this runlevel
  34. if [ "${previous}" != "N" ]; then
  35.         for i in $(ls -v ${rc_base}/rc${runlevel}.d/K* 2> /dev/null)
  36.         do
  37.                 check_script_status
  38.                 suffix=${i#$rc_base/rc$runlevel.d/K[0-9][0-9]}
  39.                 prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
  40.                 sysinit_start=$rc_base/rcsysinit.d/S[0-9][0-9]$suffix
  41.                 if [ "${runlevel}" != "0" ] && [ "${runlevel}" != "6" ]; then
  42.                         if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then
  43.                                 boot_mesg -n "WARNING:\n\n${i} can't be" ${WARNING}
  44.                                 boot_mesg -n " executed because it was not"
  45.                                 boot_mesg -n " not started in the previous"
  46.                                 boot_mesg -n " runlevel (${previous})."
  47.                                 boot_mesg "" ${NORMAL}
  48.                                 boot_mesg_flush
  49.                                 continue
  50.                         fi
  51.                 fi
  52.                 ${i} stop
  53.                 error_value=${?}
  54.                 if [ "${error_value}" != "0" ]; then
  55.                         print_error_msg
  56.                 fi
  57.         done
  58. fi
  59. #Start all functions in this runlevel
  60. for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null)
  61. do
  62.         if [ "${previous}" != "N" ]; then
  63.                 suffix=${i#$rc_base/rc$runlevel.d/S[0-9][0-9]}
  64.                 stop=$rc_base/rc$runlevel.d/K[0-9][0-9]$suffix
  65.                 prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix
  66.                 [ -f ${prev_start} ] && [ ! -f ${stop} ] && continue
  67.         fi
  68.         check_script_status
  69.         case ${runlevel} in
  70.                 0|6)
  71.                         ${i} stop
  72.                         ;;
  73.                 *)
  74.                         ${i} start
  75.                         ;;
  76.         esac
  77.         error_value=${?}
  78.         if [ "${error_value}" != "0" ]; then
  79.                 print_error_msg
  80.         fi
  81. done
  82. # End $rc_base/init.d/rc
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-16 17:05:12 | 显示全部楼层
Post by huangxmooo;2064429
一. 有/etc/rc?.d  和 /etc/rc.local
二. * /etc/init.d 习惯上用来放置启动脚本而已,系统不会自动去执行它们,你可以手工执行,比如你想手工启动apache2,那就执行/etc/init.d/apache2 start
     * /etc/rc?.d 里的东西才是系统启动时要查看启动脚本的地方,那里有很多个/etc/rc?.d文件夹,那个"?"的地方表示的是你启动系统时要让它进入那个level, 现在有这么几个level: "1" 表示单用户模式, "2"-"5" 是多用户模式, "6"是重启, "0"是关机. 你指定机器启动进入哪个level, 它就会到相应的文件夹里查看启动脚本. 比如你让系统进入level 3, 那么系统就会进入/etc/rc3.d里查看启动脚本, 其它文件夹里的系统是不会去看的.
    怎么决定让系统进入哪个level呢?如果你的系统已经启动,那简单,只要执行"init $level", $level 代表你指定的level. 如果你刚按下电脑电源,你当然是没法执行这个命令的,这时系统会进入它自己默认的level, 这个值在/etc/inittab里指定,这个文件里有这么几行:
    # The default runlevel.
    id:2:initdefault:
里面的2就是默认的level. 你也可以把这个值改成你想要的值(0-6), 当然,你不想郁闷的话,就别把它改成0或者6. 哈哈

    在/etc/rc?.d文件夹里的启动脚本一般来说是一个symlink, 指向它在/etc/init.d文件夹里的真实文件(规范来说是这样,不一定非要这样,你理解好以后随便你怎么弄都可以), 它的文件名是有格式的:
      S??script-name  或者 K??script-name
     得对这个格式作个说明: "S"表示系统启动的时候会去启动这个脚本; "K"表示系统启动的时候不会启动这些脚本; "??"代表2位数字, 它用来决定脚本启动的优先级(顺序), 数字越小, 越早启动, 反之, 当关闭系统的时候,也要杀掉这些脚本, 那顺序就是倒过来了,数字越大,越早被杀. "script-name"就是脚本的名字了, 一般来说它跟它在/etc/init.d里的真实脚本名字是一样的(前面说过,不一定非得这么做).
举个例子吧, S22apache2 和 S25postfix, 系统启动的时候就会自动这么做: 先启动apache2, 然后是postfix. 如果你不想让apache2自动启动, 你可以到相应的/etc/rc?.d里把S22apache2删掉,或者把S22apache2名字改为K22apache2

    当rc?.d里的脚本启动完以后,系统才会去启动/etc/rc.local里指定的东西.还有啥不明白的不?

一。/etc/rc?.d目录下有N多第一个字母是“K”的文件,"K"表示系统启动的时候不会启动这些脚本。系统都不启动这些文件,那么它们存在有什么意义,不明白?
二。ubuntu9.10好像没有这个文件:/etc/inittab
三。如果系统的启动用户模式:2,有一脚本文件,想它在一开机就自动执行它。应该把这个脚本放在/etc/rc2.d目录还是/etc/rc.local目录,或是别的什么地方?
回复 支持 反对

使用道具 举报

发表于 2010-1-16 18:18:20 | 显示全部楼层
1. K表示关闭此运行级时执行 'Kxxxx stop'

2. http://www.google.cn/search?hl=z ... A2&aq=0&oq=

3. 放在哪里都可以,在 /etc/rc2.d 做个链接
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-16 18:29:12 | 显示全部楼层
Post by ServerOnly;2064668
1. K表示关闭此运行级时执行 'Kxxxx stop'

2. http://www.google.cn/search?hl=z ... A2&aq=0&oq=

3. 放在哪里都可以,在 /etc/rc2.d 做个链接


3.怎样链接,具体说说。
回复 支持 反对

使用道具 举报

发表于 2010-1-17 12:39:18 | 显示全部楼层
ln -s SRC DST
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-17 21:21:03 | 显示全部楼层
用这种方法可以开机启动就自动执行脚本文件么?
在/etc/rc2.d目录中增加S?文件或修改某个S?文件的内容。
回复 支持 反对

使用道具 举报

发表于 2010-1-17 22:59:56 | 显示全部楼层
嗯……这个脚本好像不是随便写的,一般都有start|stop参数的。可以参考/etc/init.d目录下其它脚本来自己写一个吧。
回复 支持 反对

使用道具 举报

发表于 2010-1-17 23:59:15 | 显示全部楼层
给你个典型应用, 到此为止吧
  1. touch /etc/rc.d/rc.local
  2. chmod +x /etc/rc.d/rc.local
  3. ln -sf /etc/rc.d/rc.local /etc/rc.d/rc1.d/S999rc.local &&
  4. ln -sf /etc/rc.d/rc.local /etc/rc.d/rc2.d/S999rc.local &&
  5. ln -sf /etc/rc.d/rc.local /etc/rc.d/rc3.d/S999rc.local &&
  6. ln -sf /etc/rc.d/rc.local /etc/rc.d/rc4.d/S999rc.local &&
  7. ln -sf /etc/rc.d/rc.local /etc/rc.d/rc5.d/S999rc.local &&
  8. ln -sf /etc/rc.d/rc.local /etc/rc.d/rc6.d/S999rc.local
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表