我想我不久前读过一些关于此的内容,但我不记得它是如何完成的。本质上,我有一项服务/etc/init.d
希望在启动时自动启动。我记得它与将脚本符号链接到目录有关/etc/rc.d
,但我现在不记得了。这个命令是什么?
我相信我使用的是 Fedora/CentOS 衍生产品。
答案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 "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
格式非常标准,您可以在/etc/init.d
.然后您可以像这样使用脚本/etc/init.d/myscript start
或chkconfig myscript start
.手册ckconfig
页解释了脚本的标题:
> 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.
示例启动、停止和状态代码使用中定义的辅助函数/etc/init.d/functions
启用脚本
$ chkconfig --add myscript $ chkconfig --level 2345 myscript on
检查脚本确实已启用 - 您应该看到您选择的级别“打开”。
$ chkconfig --list | grep myscript
答案2
您测试您的机器通常启动到什么运行级别。
runlevel
通常这是 5 或 2 - 有各种约定,但没有什么真正确定的,据我所知。 Ubuntu 使用 2,而我以前使用的发行版总是使用
- 1 个单用户(超级用户)
- 2 多用户
- 3.多用户+网络
- 4 未使用/用户可定义
- 5个多用户,网络+X11
然后你从你的初始化脚本中创建一个符号链接,也许是/etc/init.d/foobar
为了/etc/rc2.d/SXYfoobar
S 表示“在此运行级别启动此脚本(此处:2)”。 XY 是两位十进制数,与脚本启动的顺序相关。
如果您依赖于在您之前运行的脚本 S45barfoo,并且 S55foofoo 依赖于您的脚本,则您可以选择 45 到 55 之间的 xy。对于相同的数字,启动顺序未定义。
与此同时,Ubuntu 切换(正在切换)到另一个启动程序,称为upstart
.
并注意:并不总是链接到/etc/rcX.d
- 有时它是/etc/init/rcX.d
或类似的东西,但它应该很容易找到,位于/etc下面的某个地方。
如果您想在启动脚本末尾启动某些内容,/etc/rc.local
则需要查找文件,但如果它依赖于已运行的 X11,您可能会查找桌面环境的自动启动选项,或者/etc/X11/Xsession.d/
使用与所述类似的模式多于。
如果您依赖于网络正常运行,则有一个单独的目录 (if-up.d),用于存放已安装的设备(例如外部 USB 驱动器)/etc/udev/rules.d/
。
答案3
在这个答案中,假设我想通过 Ubuntu 系统上的服务脚本挂载在/etc/fstab
via中定义的 Windows 共享 (CIFS)。mount -a -t 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 "$1" 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: $0 start|stop" >&2
# exit 3
;;
esac
确保/etc/init.d/mountcifs
可以使用chmod 755 /etc/init.d/mountcifs
.
请注意# Default-Start: 2 3 4 5
评论中的。由于这个注释,我们可以使用以下命令让 Ubuntu 在/etc/rc2.d
、/etc/rc3.d
和文件/etc/rc4.d
夹中创建符号链接:/etcrc5.d
sudo update-rc.d mountcifs defaults
然后我们可以测试脚本如下:
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
Windows 共享应该在重新启动时自动安装。
答案4
正如 Naftuli Tzvi Kay 上面询问的有关 Debian 的问题:从 Debian 6 开始,您的脚本应包含一个 LSB(Linux 标准库)标头,指示其依赖性和功能(请参阅 Debian 维基页面)。
如果存在 LSB 标头,您可以使用insserv
将脚本包含在引导过程中(查看另一个 Debian 维基页面)。