在linux系统启动时添加自己的启动脚本

本文详细介绍了Linux系统的启动流程,从BIOS到init进程,再到运行级别的切换和用户登录,最后进入shell。同时,文章讲解了如何基于init.d和服务管理系统设置自启动脚本,包括编写启动脚本、移动到指定目录以及启用服务。另外,还简述了基于systemd服务的设置步骤,包括编写systemd服务单元文件、服务启动和管理。
摘要由CSDN通过智能技术生成

一、启动流程简介
1、流程

通电->bios->引导->操作系统->/boot->init进程->运行级别->/etc/init.d->用户登录->login shell
2、流程简介
	在设备通电以后,首先运行主板flash Memory中的程序,主要任务是检测电脑的基础组件,如主板、内存和硬盘等。当基础组件检测完成后,找到引导设备后,电脑就会进入kernel启动阶段。kernel启动阶段通过MBR中的引导程序(LILO or GRUB)把内核映像装入内存运行。Kernel启动阶段完成后,就开始启动系统的第一个进程init,它完成一系统初始化工作,使Linux系统可以正常使用。init进程是Linux系统所有进程的父进程。
	2.1 初始化阶段内核文件加载以后,开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。
	2.2 确定运行级别(runlevel命令查看),根据运行级别确定启动什么进程,不通级别对应在/etc/目录下有一个运行目录,"rc级别.d",此目录下就是接下来会启动进程的脚本的链接文件,真正的脚本在`/etc/ini.d/脚本文件`。
	2.3 `/etc/rc级别.d`目录下文件的命名规则例如:`S01motd`,其中"S"代表启动,“01”启动顺序的编号,“motd”服务的名字。也就是编号越小越先执行,编号相同的比较服务的名字,决定先后顺序,
	2.4 上述阶段执行完毕,就是用户登录阶段,分为命令行登录、ssh登录	、图形界面登录
	2.5 登录后进入一个默认的shell,debian系统默认的shell是bash,根据版本不同会有不同的默认shell
	2.6 到此基本上就启动完成了。
	参考:[Linux的启动流程简析(以Debian为例)](https://www.pianshen.com/article/2168148574/)

可以用ls -l /sbin/init确定是init还是systemd管理服务
二、基于init.d服务设置过程
了解了启动过程,那么我们的目的是希望系统启动时执行我们自己的脚本,那么我们在系统执行init.d目录下脚本的时候,添加我们自己的脚本,以下是一个简单的模板。
1、编写自己的脚本文件

#!/bin/bash
#下面这部分必须添加,否则无法设置启动项时会报错
### BEGIN INIT INFO
# Provides: ip_sh
# Required-start:   $remote_fs $syslog
# Required-stop:    $remote_fs $syslog
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
# Short-Description:    sh ip truecrypt
### END INIT INFO
do_start()
{
	#执行的内容
}
do_stop()
{
	#关闭的内容
}
do_status()
{
	#获取状态
}
case "$1" in
	start)
		#do start process
		do_start
		;;
	stop)
		#do stop process
		do_stop
		;;
	restart)
		#stop process
		do_stop
		#start process
		do_start
		;;
	status)
		#output the process status
		do_status
		;;
	*)
		echo "unknow param following,you can input start/restart/stop/status" || true
		exit 1
esac
exit 0
  1. 将脚本移动到/etc/init.d/目录,并执行insserv 脚本文件名设置启动项,设置完成会在对应级别目录产生我们脚本的链接文件。
  2. sync将修改内容写入到磁盘,重启系统即可。

三、基于systemd服务的设置流程
1、进入启动目录:/etc/systemd/system/
2、编写启动脚本并保存,下述是一个简单的模板

[Unit]
#描述服务的简短说明,用于标识和识别服务。
Description=My Service
#指定服务应该在哪个目标之后启动。network.target服务将在网络目标(network.target)之后启动,确保网络已经可用。
After=network.target

[Service]
#指定要执行的命令或脚本的路径。
ExecStart=/path/to/your/script.sh
#指定服务的工作目录,即执行命令或脚本时的当前目录
WorkingDirectory=/path/to/your/working/directory
#定义服务在失败或意外退出后的行为,always表示无论什么原因导致服务退出,都会自动重新启动。
Restart=always

[Install]
#指定服务应该被安装到哪个目标。multi-user.target表示服务将被安装到multi-user.target,即多用户目标,表示服务将在多用户模式下启动。
WantedBy=multi-user.target

3、重新加载systemd配置,以使系统识别新的服务单元文件:systemctl daemon-reload
4、系统启动时自动启动该服务,可以使用以下命令将其添加到启动项中:systemctl enable my-service

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值