探索Android底层开发

稚然
• 阅读 72

//下仔のke:https://yeziit.cn/15444/在Unix和Linux系统中,init是系统启动后由内核首先启动的用户级进程,其进程ID(PID)始终为1。init进程负责启动和管理系统服务、配置系统环境以及处理系统或服务的终止等任务。在现代的Linux发行版中,systemd已经取代了传统的init系统,成为初始化系统和服务管理器的首选。

在传统的init系统中,启动脚本通常位于/etc/init.d/目录下,并且可以使用特定的符号链接到/etc/rcX.d/目录(其中X是运行级别)来控制服务在不同运行级别的启动和停止。

然而,在systemd系统中,启动脚本被称为“单元文件”(unit files),通常具有.service扩展名,并且位于/etc/systemd/system/目录或其子目录中,或者在/lib/systemd/system/目录中提供系统默认的服务。

一个基本的systemd服务单元文件可能看起来像这样:

ini [Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/usr/bin/mycustomservice
User=mycustomuser
Group=mycustomgroup
Restart=on-failure

[Install]
WantedBy=multi-user.target 在这个例子中:

[Unit] 部分包含了关于服务的一般信息,如描述和在哪些服务之后启动。 [Service] 部分定义了服务的主要属性,如启动命令、运行服务的用户和组、重启策略等。 [Install] 部分定义了如何“安装”这个服务,即在哪些运行级别自动启动。 要使用这个服务文件,你需要将其保存为.service文件,例如mycustomservice.service,然后将其复制到/etc/systemd/system/目录。之后,你可以使用systemctl命令来管理这个服务:

bash sudo systemctl daemon-reload # 重新加载systemd守护进程以读取新的服务文件
sudo systemctl start mycustomservice # 启动服务
sudo systemctl enable mycustomservice # 设置服务在系统启动时自动运行
sudo systemctl status mycustomservice # 查看服务状态 请注意,编写自定义的systemd服务文件需要具备一定的系统管理和服务配置知识,以确保服务能够正确、安全地运行。在Linux系统中,init脚本通常是指用于初始化系统服务的一组脚本文件。这些脚本文件在系统启动时由init进程(或在现代系统中由systemd服务管理器)执行,以设置系统环境、启动守护进程(daemon)和处理其他系统级任务。不过,需要注意的是,随着systemd的普及,传统的init脚本逐渐被systemd单元文件所取代。

在传统的SysV init系统中,init脚本通常位于/etc/init.d/目录下,并且是一组可执行的shell脚本。每个脚本都定义了一种服务的启动、停止、重启和状态查询等操作。此外,这些脚本还通过符号链接到/etc/rcX.d/目录中的不同运行级别(runlevel)下,以控制服务在不同系统状态下的行为。

解析和分析init脚本通常涉及以下几个方面:

脚本结构:init脚本通常遵循特定的结构,包括定义服务名称、提供启动和停止函数、处理命令行参数等。脚本开头通常会包含一些注释,解释服务的功能和用法。

环境变量和配置:脚本可能会设置或依赖特定的环境变量和配置文件。这些变量和文件通常用于定义服务的运行参数、日志文件位置、依赖关系等。

启动和停止逻辑:脚本中最重要的部分是启动(start)和停止(stop)服务的逻辑。这些逻辑通常包括启动守护进程、检查进程状态、处理信号等。

状态查询:脚本通常还提供状态查询(status)功能,以便用户可以查看服务的当前状态(如运行中、已停止等)。

命令行参数:脚本应该能够处理init.d框架提供的标准命令行参数,如start、stop、restart、status等。

错误处理和日志记录:良好的init脚本应该包含适当的错误处理逻辑,并在必要时记录日志信息。

下面是一个简化的init脚本示例,用于分析:

bash #!/bin/sh

/etc/init.d/example-service

定义服务名称和PID文件位置

SERVICE_NAME="example-service"
PIDFILE="/var/run/${SERVICE_NAME}.pid"

启动函数

start() {
echo "Starting $SERVICE_NAME"
# 这里应该是启动服务的命令
# 例如: /usr/sbin/example-service &
# 为了简化,我们使用echo代替
echo $$

$PIDFILE
echo "Started"
}

停止函数

stop() {
echo "Stopping $SERVICE_NAME"
# 这里应该是停止服务的命令
# 例如: kill cat $PIDFILE
# 我们使用rm代替,模拟停止服务
rm -f $PIDFILE
echo "Stopped"
}

状态查询函数

status() {
# 检查PID文件是否存在
if [ -f $PIDFILE ]; then
echo "$SERVICE_NAME is running (PID: cat $PIDFILE)"
else
echo "$SERVICE_NAME is stopped"
fi
}

处理命令行参数

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac

exit 0 在分析init脚本时,重要的是理解每个函数的作用,以及它们是如何被命令行参数调用的。同时,需要注意脚本中的错误处理、日志记录和配置管理等方面,这些都会影响服务的可靠性和可维护性。

对于现代的systemd系统,分析服务的行为将涉及检查.service单元文件,这些文件具有不同的结构和语法,但目的相似:定义服务的启动、停止和管理方式。

点赞
收藏
评论区
推荐文章
刘望舒 刘望舒
3年前
Android系统启动流程(四)Launcher启动过程与系统启动流程
Android框架层Android系统启动categories:Android框架层本文首发于微信公众号「刘望舒」前言此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三
刘望舒 刘望舒
3年前
Android系统启动流程(一)解析init进程启动过程
作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。"tag:Android框架层Android系统启动categories:Android框架层本文首发于微信公众号「刘望舒」
GoCoding GoCoding
2年前
Supervisor 开始
Supervisor是Linux/Unix操作系统上的进程管理工具。本文介绍了于Ubuntu18上如何使用Supervisor开机启动、保活守护自己的服务进程。安装建议系统方式安装,可开机启动。bashsudoaptinstallsupervisorySystemd查看服务状态:bash$sudosystemctlstatu
九路 九路
3年前
Android 内存管理机制
前言:Android系统是基于Linux内核开发的操作系统,而Linux系统有其独到的内存管理机制,会在进程活动停止后结束该进程。Android在此基础上优化了内存管理,会把进程都保存在内存中,直到系统需要更多内存为止,释放部分进程。这些被保存在内存中的进程,并不会影响系统的运行速度,相反,在重新打开这些进程时,会提升进程启动速度Android内存管
Bill78 Bill78
3年前
Python多进程 - 实现多进程的几种方式
方式一:os.fork()coding:utf8"""pidos.fork()1.只用在Unix系统中有效,Windows系统中无效2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0"""importospidos.fork()ifpid0:
Easter79 Easter79
2年前
Supervisor中启动netcore网站
1.安装配置Supervisorsupervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程自动恢复的功
Stella981 Stella981
2年前
Centos7.6上部署Supervisor来监控和操作各类服务
supervisor  是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不
Stella981 Stella981
2年前
Linux下inittab文件详解
/etc/inittab文件详解Linux系统的启动过程为:加电自检根据BIOS中的设置从指定的设备启动找到设备MBR中的bootloader引导启动系统启动kernel启动init进程我们看到,Linux系统启动的最后是启动init进程,而init进程是怎么工作的呢?init进程就是根据/etc/inittab
Stella981 Stella981
2年前
Python实现守护进程
概念守护进程(Daemon)也称为精灵进程是一种生存期较长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器都是用守护进程实现的,例如inetd守护进程。需要了解的相关概念进程(process)
秦朗 秦朗
2个月前
iOS逆向1期
//下仔のke:https://yeziit.cn/14381/iOS是由苹果公司开发的移动操作系统,专门为iPhone、iPad、iPodtouch等苹果设备设计。它基于Unix的CoreOS内核,并采用了ObjectiveC作为开发语言。iOS系统具有