如何编写一个Systemd Service?

Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由Systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。Systemd 广泛应用于新版本的RHEL、SUSE Linux Enterprise、CentOS、Fedora和openSUSE中,用于替代旧有的服务管理器service。

一、如何创建一个服务?

这里假设您已经自行编译安装好了nginx,下面我们来创建一个nginx.service文件

vi /etc/systemd/system/nginx.service

内容如下:

[Unit]
Description=Nginx - high performance web server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

重新加载服务配置文件,使创建的nginx服务生效:

systemctl daemon-reload

这样我们就可以用Systemd的方式来管理nginx了,命令如下:

#启动nginx
systemctl start nginx
#重载nginx
systemctl reload nginx
#停止nginx
systemctl stop nginx
#重启nginx
systemctl restart nginx
#如果需要开机启动
systemctl enable nginx
#如果需要取消开机启动
systemctl disable nginx

 

二、关于Systemd 服务

2.1三个组成部分

Systemd 服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装(install)的定义。

1)控制单元 unit

从上面的例子中我们看到Unit内容如下:

[Unit]
Description=Nginx - high performance web server
After=network.target
  • Description:代表整个单元的描述,可根据需要任意填写。
  • Before/After:指定启动顺序。
  • network.target代表有网路,network-online.target代表一个连通着的网络。

 

2)服务本体 [service]

上面的Service中服务本体内容为:

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
  • Type:服务的类型,各种类型的区别如下所示
    • simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
    • forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。
    • oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用 RemainAfterExit=yes。意思是说,即使没有进程存在,Systemd 也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用;分割,如需换行可以用\。
    • dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
  • ExecStart:在输入的命令是start时候执行的命令,这里的命令启动的程序必须使用绝对路径,比如你必须用/sbin/arp而不能简单的以环境变量直接使用arp。
  • ExecStop:在输入的命令是stop时候执行的命令,要求同上。
  • ExecReload:这个不是必需,如果不写则你的service就不支持restart命令。ExecStart和ExecStop是必须要有的。

其实服务本体中还有更多的参数,这里在额外列举一些常用的参数:

  • User:指定用户运行
  • Group:指定用户组运行
  • WorkingDirectory:进程工作目录,也就是说在执行前会先切换到这个目录

 

3)安装 [install]

上面例子安装内容为:

[Install] WantedBy=multi-user.target
  • WantedBy:运行级别/设置服务被谁装载,一般设置为multi-user.target(从Centos7以后bai采用target概念来定义运行级别,multi-user.target是第三级别)

 

2.2、存放的位置

Systemd Service 位于 /etc/systemd/system(供系统管理员和用户使用),/usr/lib/systemd/system(供发行版打包者使用),我们一般使用前者即可。

 

总结

Systemd Service 是一种替代/etc/init.d/下脚本的更好方式,它可以灵活的控制你什么时候要启动服务,一般情况下也不会造成系统无法启动进入紧急模式。所以如果想设置一些开机启动的东西,可以试着写 Systemd Service。当然了,前提是你使用的Linux发行版是支持它的才行。

 

 

REF

原文链接:https://www.xiaoz.me/archives/14458

https://segmentfault.com/a/1190000014740871

https://zh.opensuse.org/openSUSE:How_to_write_a_systemd_service

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇