我想我已经读了一段时间,但是我不记得它是如何完成的。本质上,我在/etc/init.d中有一​​项服务,希望在启动时自动启动。我记得它与将脚本符号链接到/etc/rc.d目录有关,但是目前我还不记得。这是什么命令?

我相信我正在使用Fedora / CentOS衍生产品。

评论

这取决于您的操作系统。您正在运行哪种unix变体,如果是Linux,则运行什么发行版?在/etc/init、/etc/init.d、/etc/rc.d、/etc/rc.local中,还有其他几个?

我想我正在使用CentOS或类似的产品。 Debian的答案会有所不同吗?我也对Debian的解决方案感兴趣。

#1 楼

如前所述,如果您使用的是基于Red Hat的系统,则可以执行以下操作:


创建脚本并将其放置在/etc/init.d中(例如/etc/init.d/myscript)。该脚本应具有以下格式:

 #!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: /etc/init.d {start|stop|status|restart}"
esac

exit 0 
 


该格式非常标准,您可以查看/etc/init.d/myscript start中的现有脚本。然后,您可以像chkconfig myscript startckconfig这样使用脚本。 /etc/init.d/functions手册页解释了脚本的标题:

启用脚本

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.



检查脚本是否已启用-选择的级别应显示为“ on” 。

$ chkconfig --add myscript 
$ chkconfig --level 2345 myscript on 




评论


Chkconfig是您想要的。 +1

–哇
2011年9月9日上午8:31

为什么要在运行级别2、3、4和5上启动init?您是否需要避免避免在运行级别2启动服务器?而且在RHEL上未定义运行级别4,那么为什么尝试在该运行级别启动它?不批评,只想知道。我是本地Slackware用户。

–布鲁斯·埃迪格(Bruce Ediger)
2011年9月9日下午13:35

RHEL上没有定义4,但确实存在。您可以为自己的东西偷东西。

–凯文M
2011年9月9日下午16:25

标头取自chkconfig手册页。在大多数情况下,我个人坚持使用235或35。

–罐头
2011-09-10 6:33

如果在启动过程中启动失败,是否可以查看日志?

– Utkarsh Sinha
2014年5月29日13:17

#2 楼

您进行测试,您的计算机通常会开始进入哪种运行级别。 Ubuntu使用2,而以前使用的发行版则一直使用


1单用户(超级用户)
2多用户
3多用户+网络
4个未使用/用户可定​​义的
5个多用户,网络+ X11
'在此运行级别(此处:2)中启动此脚本。
XY是两位十进制数字,与序列相关,脚本将启动。

如果您先运行脚本S45barfoo,而S55foofoo取决于您的脚本,则可以在45到55之间选择xy。对于相等的数字,启动顺序是不确定的。

Ubuntu同时切换(正在切换)到另一个启动程序,称为/etc/init.d/foobar

并注意:并非总是链接到/etc/rc2.d/SXYfoobar的链接-有时是upstart或类似的东西,但是应该容易找到,位于/ etc下。

如果要在启动脚本的末尾启动某些内容,则将查找文件/etc/rcX.d,但是如果它取决于已经运行的X11,则可能会寻找台式机的自动启动选项环境,或具有与上述类似模式的/etc/init/rcX.d。驱动/etc/rc.local

评论


没有为您执行符号链接的命令吗?我以为我想起了类似的事情。

– Naftuli Kay
2011年9月9日在3:04

不是update-rc.d吗?

– Naftuli Kay
2011年9月9日在3:07

GUI还是命令行?您的DE可能会提供一个工具来标记运行级别以及在何处启动或停止脚本。我见过类似的内容,但不记得名称,以及如何指定数字(xy)。

–用户未知
2011年9月9日在3:08

命令行。它为您处理符号链接,并允许您切换是否运行某些脚本。

– Naftuli Kay
2011年9月9日,下午3:11

#3 楼

正如Naftuli Tzvi Kay在上面有关Debian的问题那样:从Debian 6开始,您的脚本应包含一个LSB​​(Linux标准库)标头,该标头指示其依赖关系和功能(请参见debian wiki页面)。

如果是LSB标头存在,您可以使用insserv在引导过程中包含您的脚本(请参见另一个debian wiki页面)。

#4 楼

在此答案中,假设我要通过Ubuntu系统上的服务脚本通过/etc/fstab挂载mount -a -t cifs中定义的Windows共享(CIFS)。首先,我在/etc/init.d/mountcifs下创建一个条目,其内容为:
#! /bin/sh
### BEGIN INIT INFO
# Provides:          mountcifs
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Mounts / Umounts Window Shares (CIFS)
# Description: Mounts / Umounts Window Shares (CIFS)
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

case "" in
  start)
        mount -a -t cifs
        ;;
  stop)
        umount -a -t cifs
        ;;
  restart|reload|force-reload)
        umount -a -t cifs
        mount -a -t cifs
        ;;
  *)
        # echo "Usage: 
sudo update-rc.d mountcifs defaults
start|stop" >&2 # exit 3 ;; esac

请注意注释中的# Default-Start: 2 3 4 5。我们可以使用以下命令让Ubuntu创建符号链接:
sudo service start mountcifs
df -h # should see Windows Shares
sudo service stop mountcifs
df -h # all Windows Shares should be gone
sudo service start mountcifs
df -h # all Windows Shares should be back

然后我们可以如下测试脚本: 。