systemctl简单 .md
systemctl 简单 备忘
详细介绍https://wiki.archlinux.org/index.php/systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
编写单元文件
systemd
单元文件的语法来源于 XDG 桌面项配置文件.desktop
文件,最初的源头则是Microsoft Windows的.ini
文件。单元文件可以从多个地方加载,systemctl show --property=UnitPath
可以按优先级从低到高显示加载目录:
/usr/lib/systemd/system/
:软件包安装的单元/etc/systemd/system/
:系统管理员安装的单元
注意:
- 当
systemd
运行在用户模式下时,使用的加载路径是完全不同的。 - systemd 单元名仅能包含 ASCII 字符,下划线和点号和有特殊意义的字符('@', '-')。其它字符需要用 C-style "\x2d" 替换。
提示: 以 #
开头的注释可能也能用在 unit-files 中,但是只能在新行中使用。不要在 systemd 的参数后面使用行末注释, 否则 unit 将会启动失败。
处理依赖关系
[unit]
Requires=B
After=B
服务类型
[Service]
Type=simple | forking | oneshot | notify | dbus | idle
附加配置片段
要附加配置片段,先创建名为 /etc/systemd/system/<单元名>.d/
的目录,然后放入 *.conf
文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。下面的更新方式比较简单:
# systemctl edit unit
这将会在编辑器中打开文件 /etc/systemd/system/*unit*.d/override.conf
,编辑完成之后自动加载。
Note: 并不是所有参数都会被子配置文件覆盖。例如要修改 Conflicts=
就必须 替换原始文件。
目标(target)
运行级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和运行级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 运行级别的目标,仍可以使用旧的 telinit 运行级别
命令切换。
工作原理
从systemd 226版本开始,/etc/pam.d/system-login
默认配置中的pam_systemd
模块会在用户首次登陆的时候, 自动运行一个 systemd --user
实例。 只要用户还有会话存在,这个进程就不会退出;用户所有会话退出时,进程将会被销毁。当 #随系统自动启动systemd用户实例 启用时, 这个用户实例将在系统启动时加载,并且不会被销毁。systemd用户实例负责管理用户服务,用户服务可以使用systemd提供的各种便捷机制来运行守护进程或自动化任务,如socket激活、定时器、依赖体系以及通过cgroup限制进程等。
和系统单元类似,用户单元可以在以下目录找到(按优先级从低到高排序):
/usr/lib/systemd/user/
这里存放的是各个软件包安装的服务。/etc/systemd/user/
这里存放的是由系统管理员维护的系统范围的用户服务。~/.config/systemd/user/
这里存放的是用户自身的服务。
普通用户使用 timer
普通用户 ~/.config/systemd/user/
例子:
- 每五天执行一次(重启可能失效,未验证)
# missions.timer
[Unit]
Description = Run missions.service every 5 days
[Timer]
Persistent = true
OnUnitInactiveSec=5d
Unit = missions.service
[Install]
WantedBy = basic.target
# missions.service
[Unit]
Description=Notify missions that you needed to deal with
[Service]
Type = simple
ExecStart = /home/foxer/MyBin/missions.sh "/home/foxer/MyBin/missions.txt"
[Install]
WantedBy= default.target
-
每3天运行一个脚本
# cnblog.timer [Unit] Description=博客园自动上传定时任务 After=NetworkManager.service [Timer] OnCalendar=*-*-1/3 12:30:00 Persistent=true [Install] WantedBy=default.target
# cnblog.service [Unit] Description=博客园自动上传 [Service] ExecStart=/bin/python /home/nsfoxer/Mbin/MyTools/cnblog_upload/cnblog.py /home/nsfoxer/Documents/articles/ -d 0
之后运行
systemctl --user daemon-reload # 重载配置文件 systemctl --user enable --now cnblog.timer # 用户登录后启动timer单元
可以
systemctl --user list-timers --all
查看记录注:可以使用
systemd-analyze
进行分析时间systemd-analyze --iterations=10 calendar "*-*-* 12:30:00"