systemd系统守护进程

本文介绍Systemd服务管理系统的核心功能,包括服务的启动、停止、重启等操作方式,以及开机服务的管理和运行级别的设置方法。

systemd提供更优秀的框架以表示系统服务间的依赖关系
实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果
systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。
systemd尽可能减少对shell脚本的依赖。

systemd单位类型

(systemctl --type=单位类型,用来过滤单位):
服务(service):管理着后台服务;
挂载(mount)自动挂载(automount):用来挂载文件系统;
目票(target):运行级别;
套接字(socket):用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位;

开机服务管理

=================================================
systemd添加新的unit(daemon)
也就是采用systemd来管理,/sbin/chkconfig --add foo相当
把新生成的foo.service 放到/usr/lib/systemd/system/下面,然后采用load命令导入
systemctl load foo.service

删除unit(daemon)
删除一个unit没有相应的命令,通常的做法是停掉daemon,然后删除相应的配置文件。

开机启动unit
systemctl enable postfix.service
增加由/usr/lib/systemd/system/到/etc/systemd/system/multi-user.target.wants/下的软链接
ln -s '/usr/lib/systemd/system/postfix.service' '/etc/systemd/system/multi-user.target.wants/postfix.service'

开机不启动unit
systemctl disable httpd.service
删除/etc/systemd/system/multi-user.target.wants下的软链接

查看开机是否启动
systemctl is-enabled .service #查询服务是否开机启动

systemd查看开机自启动的程序
相当于chkconfig --list
ls /etc/systemd/system/multi-user.target.wants/

查看systemd单元加载及活动情况
systemctl

显示启动失败的单元
systemctl --failed

查看systemd管理的所有单元
systemctl list-unit-files

服务管理

=================================================
启动服务
systemctl start httpd.service
关闭服务
systemctl stop httpd.service
重启服务
systemctl restart httpd.service
重新加载
systemctl reload httpd.service
查看状态
systemctl status httpd.service
包括启动状态、启动时间、主进程及相关进程、相关日志

运行级别

=================================================
systemd用target替代了runlevel的概念,多个的 'target' 可以同时激活
systemd不使用/etc/inittab,如何查看系统默认的运行级别
ll /etc/systemd/system/default.target
查看这个软链接真正指向的文件

如何查看系统的当前运行级别
runlevel依然可用
systemd的方法是:systemctl list-units --type=target

改变当前target,重启无效
systemctl isolate graphical.target

修改默认运行级别
1.首先删除已经存在的符号链接
rm /etc/systemd/system/default.target
2.默认级别转换为3(文本模式)
systemctl enable multi-user.target
相当于ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
3.重启
reboot

运行级别如下:
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target


### 配置 `systemd` 守护进程 在 Linux 系统中,`systemd` 是一个系统和服务管理器,能够有效地管理守护进程的生命周期。通过编写服务单元文件,可以实现对守护进程的启动、停止、重启、状态监控等操作。以下是如何配置和管理 `systemd` 守护进程的详细说明。 #### 创建服务单元文件 服务单元文件通常存放在 `/usr/lib/systemd/system/`(系统级)或 `/usr/lib/systemd/user/`(用户级)目录中。系统级服务适用于在系统启动时无需用户登录即可运行的服务,而用户级服务则适用于需要用户会话上下文的服务 [^3]。 服务单元文件的基本结构如下: ```ini [Unit] Description=My Custom Service After=network.target [Service] Type=simple ExecStart=/usr/bin/myapp Restart=always User=myuser Group=mygroup [Install] WantedBy=multi-user.target ``` - **[Unit]** 部分定义了服务的元信息,如描述和依赖关系。 - **[Service]** 部分定义了服务的行为,包括启动方式、执行命令、用户权限等。 - **[Install]** 部分定义了服务的安装配置,如目标运行级别。 #### 服务类型(`Type`)选择 根据服务的启动方式和生命周期管理需求,可以选择不同的 `Type` 类型: - **simple**:默认类型,服务的主进程即为 `ExecStart=` 指定的进程。适用于前台运行的应用程序。 - **forking**:适用于传统的守护进程,服务进程在启动时会 fork 一个子进程并退出父进程。 - **oneshot**:适用于执行一次性任务的服务,服务在 `ExecStart=` 指令执行完毕后即退出。 - **notify**:服务在启动完成后需通过 `sd_notify()` 向 `systemd` 发送通知,以表明服务已就绪。 - **dbus**:服务的启动由 D-Bus 激活机制控制。 - **idle**:与 `simple` 类似,但服务的实际启动会在所有任务(如输出日志)完成后再进行。 - **exec**(systemd 244+):确保服务的主进程是 `ExecStart=` 指定的进程,不允许多级 fork [^1]。 例如,一个使用 `forking` 类型的 SSH 服务配置如下: ```ini [Service] Type=forking ExecStart=/usr/sbin/sshd ``` #### 服务控制与管理 一旦服务单元文件创建完成,可以通过 `systemctl` 命令对服务进行管理: - **启动服务**:`sudo systemctl start myservice.service` - **停止服务**:`sudo systemctl stop myservice.service` - **重启服务**:`sudo systemctl restart myservice.service` - **查看服务状态**:`sudo systemctl status myservice.service` - **启用开机启动**:`sudo systemctl enable myservice.service` - **禁用开机启动**:`sudo systemctl disable myservice.service` #### 日志查看与调试 `systemd` 提供了强大的日志记录功能,可以通过 `journalctl` 命令查看服务的日志信息: - **查看服务日志**:`sudo journalctl -u myservice.service` - **实时查看服务日志**:`sudo journalctl -u myservice.service -f` 日志记录可以帮助调试服务启动失败或运行时异常等问题。 #### 服务依赖管理 服务之间的依赖关系可以通过 `After`、`Before`、`Requires`、`Wants` 等指令在 `[Unit]` 部分定义: - **After**:表示该服务应在指定的服务之后启动。 - **Before**:表示该服务应在指定的服务之前启动。 - **Requires**:表示该服务依赖于指定的服务,若指定服务启动失败,当前服务也不会启动。 - **Wants**:表示该服务希望依赖于指定的服务,但即使指定服务启动失败,当前服务仍会启动。 例如,如果服务需要在网络就绪后启动,可以添加以下配置: ```ini [Unit] After=network.target ``` #### 服务环境配置 可以通过 `Environment` 指令为服务设置环境变量: ```ini [Service] Environment="VAR1=value1" "VAR2=value2" ``` 也可以通过 `EnvironmentFile` 指定外部环境变量文件: ```ini [Service] EnvironmentFile=/etc/myapp/environment.conf ``` #### 服务重启策略 `Restart` 指令用于定义服务的自动重启策略: - **no**:默认值,不自动重启。 - **on-success**:仅在服务正常退出时重启。 - **on-failure**:在服务异常退出时重启。 - **on-abnormal**:在服务因信号或超时退出时重启。 - **always**:无论服务退出原因如何,总是重启。 ```ini [Service] Restart=always ``` #### 服务资源限制 可以通过 `LimitCPU`、`LimitFSIZE`、`LimitDATA` 等指令限制服务的资源使用: ```ini [Service] LimitNOFILE=1024 LimitNPROC=50 ``` 这些限制可以防止服务占用过多系统资源,影响其他服务的正常运行。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值