inittab

现代Linux已用systemd取代了inittab,并将inittab的功能集成在了systemctl中。可以通过编写适当的.service文件并将其放置在/etc/systemd/system/目录下,然后使用systemctl命令来管理和控制这些服务。这是在现代Linux中定义和管理初始化进程的推荐方式。参考SysVinit

但是现代Linux中依然有部分发行版支持自建/etc/inittab,如Arch

ArchWiki中明确指出:重启之前,务必使用 telinit q 测试修改过的 /etc/inittab,任何小小的语法错误都将导致系统无法启动。

可以通过pstree观察PID为1是否为inittab确定是否可用,以及/etc/inittab是否存在判断。并且,虽然现代Linux用systemd取代了,但是其他Unix系统如AIX,以及老的(占有率其实很高)Linux还在用,所以学这个是有意义的。
每个inittab文件条目由四个字段组成,字段之间使用冒号(:)进行分隔。格式如下:

Identifier:RunLevel:Action:Command

Identifier(标识):一个用于唯一标识该条目的字符串,可以是一个或多个字符。
RunLevel(运行级别):指定可以在哪个运行级别下处理该条目。运行级别与系统中的进程配置相对应,使用数字0到9表示。例如,如果系统处于运行级别1,那么只有RunLevel字段中包含1的条目才会启动。如果没有指定任何运行级别,那么假定该进程在所有运行级别下都有效。
Action(操作):指示初始化命令如何处理指定进程。
    respawn:如果该进程不存在,请启动它。在进程终止时,重新启动该进程。
    wait:启动该进程并等待它的终止。当进入与条目的运行级别匹配的运行级别时,执行该操作。
    once:启动该进程,并且不等待其终止。当它终止时,不要重新启动该进程。
    boot:启动该进程,但不等待其终止。只在系统引导期间执行一次。
    off:在系统引导期间不启动该进程。
Command(命令):要执行的命令或脚本。命令用“”包裹,或者填入脚本路径。

每个条目都以换行符分隔,可以使用反斜杠(\)表示条目的连续。可以在行的开头使用冒号(:)将条目注释掉。
另外要注意Identifier必须唯一,不能冲突,Runlevel不同发行版可能有所不同。

.service

一个典型的.service文件包含以下几个部分:

[Unit]:这个部分定义了服务的基本信息,包括服务名称、描述、依赖关系等。
    Description:描述服务的简短说明。
    Requires:定义服务所依赖的其他服务。
    After:定义服务在哪些其他服务之后启动。
[Service]:这个部分定义了服务的执行参数和行为。
    Type:指定服务的类型,可以是simple(默认值)、forking、oneshot、dbus、notify等。
    ExecStart:指定服务启动时要执行的命令或脚本。
    Restart:定义服务在发生故障时的重启行为。
    WorkingDirectory:指定服务运行的工作目录。
    User和Group:指定服务运行的用户和用户组。
[Install]:这个部分定义了服务的安装配置。
    WantedBy:定义服务在哪个target或目标中激活。

示例

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

[Service]
Type=simple
ExecStart=/usr/bin/my-service
Restart=always
WorkingDirectory=/path/to/service
User=myuser
Group=mygroup

[Install]
WantedBy=multi-user.target

标签: none

评论已关闭