在Debian系统中,init.d脚本是一种传统但仍然广泛使用的服务管理方式。即使现在许多系统已转向systemd,了解如何编写和配置init.d脚本对于维护旧系统、嵌入式设备或深入理解Linux启动机制仍非常有价值。本文将手把手教你如何为Debian系统编写一个完整的init.d脚本,适合完全没有经验的小白用户。
什么是init.d脚本?
/etc/init.d/目录存放的是系统启动时由SysV init系统调用的Shell脚本。这些脚本用于启动、停止、重启或查询系统服务的状态。每个脚本能接收如
start、
stop、
restart、
status等参数。
编写一个简单的init.d脚本
假设我们要创建一个名为
myapp的服务,它运行一个简单的Python Web服务器(仅作演示)。以下是完整步骤:
第1步:创建服务程序
首先,我们创建一个简单的后台程序。例如,创建
/opt/myapp/app.py:
#!/usr/bin/env python3import http.serverimport socketserverPORT = 8080with socketserver.TCPServer(("", PORT), http.server.SimpleHTTPRequestHandler) as httpd: print("Serving at port", PORT) httpd.serve_forever() 赋予执行权限:
sudo chmod +x /opt/myapp/app.py
第2步:编写init.d脚本
创建文件
/etc/init.d/myapp,内容如下:
#!/bin/bash### BEGIN INIT INFO# Provides: myapp# Required-Start: $local_fs $network $named $time $syslog# Required-Stop: $local_fs $network $named $time $syslog# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Description: My custom application service### END INIT INFODAEMON="/usr/bin/python3"DAEMON_ARGS="/opt/myapp/app.py"NAME=myappPIDFILE=/var/run/$NAME.pidSCRIPTNAME=/etc/init.d/$NAME. /lib/lsb/init-functionscase "$1" in start) log_daemon_msg "Starting $NAME" start-stop-daemon --start --quiet --pidfile $PIDFILE \ --exec $DAEMON --background --make-pidfile -- \ $DAEMON_ARGS log_end_msg $? ;; stop) log_daemon_msg "Stopping $NAME" start-stop-daemon --stop --quiet --pidfile $PIDFILE \ --retry=TERM/30/KILL/5 rm -f $PIDFILE log_end_msg $? ;; status) status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $? ;; restart) $0 stop $0 start ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 exit 3 ;;esac 第3步:设置权限并启用服务
赋予脚本执行权限:
sudo chmod +x /etc/init.d/myapp
然后使用
update-rc.d命令将其加入开机启动:
sudo update-rc.d myapp defaults
现在你可以测试服务:
sudo service myapp startsudo service myapp statussudo service myapp stop
关键说明
LSB头信息(即### BEGIN INIT INFO部分)非常重要,它告诉系统该服务的依赖关系和运行级别。
start-stop-daemon是Debian系发行版中用于安全启动/停止守护进程的标准工具。 PID文件用于跟踪进程ID,确保服务不会重复启动。 使用
. /lib/lsb/init-functions可以调用标准的日志函数(如
log_daemon_msg),提升脚本专业性。
常见问题排查
如果服务无法启动,请检查:
脚本是否有执行权限? 程序路径是否正确? 日志输出(可临时去掉--quiet参数查看错误) 是否缺少依赖(如Python环境)?
总结
通过本教程,你已经掌握了Debian init.d脚本编写的基本方法。虽然现代系统多采用systemd,但在许多生产环境中,尤其是老旧或资源受限的设备上,SysV init和init.d脚本依然不可或缺。掌握这项技能,不仅能帮助你更好地进行Linux系统服务管理,还能加深对操作系统启动流程的理解。
希望这篇Debian开机启动脚本教程对你有帮助!如果你是初学者,建议多动手实践,并参考系统中已有的init.d脚本(如
/etc/init.d/cron)来学习更多技巧。祝你在Shell脚本教程的学习之路上越走越远!
