一:简单的例子
在CentOS7之后自定义开机启动服务,可以通过创建一个systemd服务单元文件来实现。以下是创建自定义服务并设置其开机启动的步骤:
1,编辑服务文件,并添加以下内容:
[Unit]
Description=My custom startup service
After=network.target[Service]
Type=simple
ExecStart=/usr/local/bin/my_service.sh[Install]
WantedBy=multi-user.target
2,使服务文件可执行:
chmod +x /etc/systemd/system/my_service.service
3,重新加载systemd管理器配置:
systemctl daemon-reload
4,启用服务以在开机时启动:
systemctl enable my_service.service
5,(可选)立即启动服务,而不需要重启:
systemctl start my_service.service
二:语法
1,文件存放
CentOS 7的服务systemctl脚本存放在/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,还是存在系统服务里,即/usr/lib/systemd/system目录下。每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
2, gdm例子
cat gdm.service
[Unit]
Description=GNOME Display Manager
# replaces the getty
Conflicts=getty@tty1.service
After=getty@tty1.service
# replaces plymouth-quit since it quits plymouth on its own
Conflicts=plymouth-quit.service
After=plymouth-quit.service
# Needs all the dependencies of the services it's replacing
# pulled from getty@.service and plymouth-quit.service
# (except for plymouth-quit-wait.service since it waits until
# plymouth is quit, which we do)
After=rc-local.service plymouth-start.service systemd-user-sessions.service
# GDM takes responsibility for stopping plymouth, so if it fails
# for any reason, make sure plymouth still stops
OnFailure=plymouth-quit.service
[Service]
ExecStart=/usr/sbin/gdm
ExecStartPost=-/bin/bash -c "TERM=linux /usr/bin/clear > /dev/tty1"
KillMode=mixed
Restart=always
IgnoreSIGPIPE=no
BusName=org.gnome.DisplayManager
StandardOutput=syslog
StandardError=inherit
EnvironmentFile=-/etc/locale.conf
ExecReload=/bin/kill -SIGHUP $MAINPID
[Install]
Alias=display-manager.service
首先,gdm.service是一个systemd服务单元文件,用于定义GNOME Display Manager (GDM)的启动、停止和管理方式。Systemd是Linux系统的一个初始化系统和服务管理器,它用于启动和管理系统服务。接下来,我会逐段解释这个文件的内容:
[Unit]
Description=GNOME Display Manager:为服务提供一个描述,这里是“GNOME Display Manager”。
Conflicts=getty@tty1.service 和 After=getty@tty1.service:这表示GDM与getty@tty1.service有冲突,并且GDM应在getty@tty1.service之后启动。
Conflicts=plymouth-quit.service 和 After=plymouth-quit.service:同样,这表示GDM与plymouth-quit.service有冲突,并且GDM应在plymouth-quit.service之后启动。
After=rc-local.service plymouth-start.service systemd-user-sessions.service:这表示GDM应在这些服务之后启动。
OnFailure=plymouth-quit.service:如果GDM启动失败,则尝试启动plymouth-quit.service。
[Service]ExecStart=/usr/sbin/gdm:定义启动GDM的命令。
ExecStartPost=-/bin/bash -c "TERM=linux /usr/bin/clear > /dev/tty1":在GDM启动后执行的命令。这里使用bash来清除/dev/tty1的内容。
KillMode=mixed:定义如何停止服务。mixed意味着首先尝试SIGTERM,然后SIGKILL。
Restart=always:无论何种情况,只要GDM退出,就总是重启它。
IgnoreSIGPIPE=no:是否忽略SIGPIPE信号。在这里,我们不忽略它。
BusName=org.gnome.DisplayManager:服务的DBus名称。
StandardOutput=syslog:将标准输出发送到系统日志。
StandardError=inherit:标准错误继承父进程的设置。
EnvironmentFile=-/etc/locale.conf:加载/etc/locale.conf文件以设置环境变量。
ExecReload=/bin/kill -SIGHUP $MAINPID:重新加载服务的命令。这里发送SIGHUP信号给主进程。
[Install]Alias=display-manager.service:为服务定义一个别名,这样你可以使用display-manager.service来引用这个服务。
总的来说,这个服务单元文件定义了GDM的启动方式、依赖关系、启动后的操作以及重启策略等。它是systemd用来管理GDM服务的关键配置文件。
其他:
在Systemd中,Type=指令的forking值只是其中之一,用于定义服务进程的行为。除了forking,Type=指令还有其他几个可能的值,它们各自的意义如下:
Type=simple(默认值):
指示systemd直接执行ExecStart指定的命令来启动服务的主进程。这是最常见的类型,也是省略Type指令时的默认类型。如果服务要启动其他服务,并且不是socket激活型,则不应使用此类型。
Type=forking:
systemd会启动服务,并期待服务进程会派生(fork)一个子进程后立即退出。systemd会等待父进程退出,然后将子进程作为服务的主进程进行监控。这种类型通常用于传统的守护进程。
Type=oneshot:
服务会启动并执行一个任务,然后立即退出。Systemd会等待该任务完成后再继续处理其他服务。这种类型的服务通常用于执行一次性任务。
Type=dbus:
服务会通过D-Bus消息通知systemd它已经启动完成。这种类型的服务通常用于与D-Bus系统集成的服务。
Type=notify:
服务启动后会通过调用systemd的通知API来通知systemd它已经准备好并可以开始接收请求。这允许服务在完全初始化后才被systemd视为启动成功。
Type=idle:
服务会在其他任务都执行完毕后才开始运行。这可以用于确保在系统不太忙碌的时候启动服务。
在选择服务类型时,需要根据服务的实际行为和需求来确定最适合的类型。不正确的类型选择可能会导致systemd无法正确管理服务的生命周期或状态。例如,如果一个服务实际上是forking类型的,但错误地配置为simple类型,systemd可能无法正确识别服务的启动完成状态。
当配置.service文件时,请确保你了解你的服务是如何工作的,并选择正确的Type=值。如果需要,你可以查阅服务的文档或联系服务的开发者以获取更多关于如何配置该服务的建议。