启动时需要执行的脚本放在/etc/init.d
,以及其中包含的文件/etc/rc*.d
符号链接指向 /etc/init.d 中的文件。此外,符号链接的名称指示服务是在特定运行级别启动(S*)还是停止(杀死,K*)。我发出命令“ls -al”来检查/etc/rc3.d
,输出如下:
drwxr-xr-x. 2 root root 4096 Apr 6 23:04 .
drwxr-xr-x. 10 root root 4096 May 22 2015 ..
lrwxrwxrwx. 1 root root 20 May 22 2015 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 May 22 2015 K90network -> ../init.d/network
lrwxrwxrwx. 1 root root 17 May 22 2015 S00livesys -> ../init.d/livesys
lrwxrwxrwx. 1 root root 16 Apr 6 23:04 S85mongod -> ../init.d/mongod
lrwxrwxrwx. 1 root root 15 May 31 2015 S95jexec -> ../init.d/jexec
lrwxrwxrwx. 1 root root 22 May 22 2015 S99livesys-late -> ../init.d/livesys-late
我认为启动脚本和终止脚本应该成对出现,但这是错误的,为什么?
答案1
如果这是针对 RHEL6 或类似的 Linux,这些脚本通常由 管理chkconfig(8)
,这确保每个服务的每个运行级别都有一个启动脚本或一个停止脚本,而不是它们是成对的。 (不确定 Ubuntu 或其他)。
从手册页chkconfig
:
Note that for every service, each runlevel has either a start script or a stop script. When switching runlevels, init will not re-start an already-started service, and will not re-stop a service that is not running.
...
--add name This option adds a new service for management by chkconfig. When a new service is added, chkconfig ensures that the service has either a start or a kill entry in every runlevel. If any runlevel is missing such an entry, chkconfig creates the appropriate entry as specified by the default values in the init script.
一个答案另一个关于运行级别的问题描述命名约定。
现在,命名方案也相当简单。名称以 S 开头的脚本将在相关运行级别启动,而名称以 K 开头的脚本将被杀死。
如果您查看运行级别更改脚本/etc/rc
,您可以看到每当更改运行级别时,如何在S*
使用start
参数执行脚本之后使用K*
输入参数执行脚本stop
。同时拥有 K 和 S 脚本意味着脚本会在每个运行级别停止和启动。
# rc This file is responsible for starting/stopping
# services when the runlevel changes.
...
# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K* ; do
...
$i stop
done
# Now run the START scripts.
for i in /etc/rc$runlevel.d/S* ; do
...
exec $i start
...
done
我只查看 RHEL6 机器,因此如果有人可以确认其他发行版有何不同,请这样做。