且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在树莓派上使Jexus以服务运行、开机自启

更新时间:2022-05-09 21:07:30

前言

此前,我们通过在树莓派上借助Mono + Jexus 布署 .Net 4.0 WebForm应用,简单介绍了如何在树莓派上布署 Jexus,并承载一个Asp.Net WebForm应用,但现在问题又来了,一不小心停电重启后,Jexus 却没有启动,而rc.local的启动方式属于一次性的,无法通过统一的命令控制,对于官方介绍上说的jws.start,请原谅我没找到(手动瀑布汗)。

目标

1、通过systemd管理jws服务,使其能通过systemctl控制启动、停止、重启。
2、使jws能够开机自动启动

名词

systemd

systemd这一名字源于Unix中的一个惯例:在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。

systemd 是一个专用于 Linux 操作系统的系统与服务管理器。 当作为启动进程(PID=1)运行时,它将作为初始化系统运行, 也就是启动并维护各种用户空间的服务。

systemd 将各种系统启动和运行相关的对象, 表示为各种不同类型的单元(unit), 并提供了处理不同单元之间依赖关系的能力。 而以 .service 为后缀的单元文件, 封装了一个被 systemd 监视与控制的进程。

单元文件中的 [Unit] 小节 包含与单元类型无关的通用信息,服务单元(.service)文件必须包含一个 [Service] 小节。

Unit小节

Description=
对单元进行简单描述的字符串。 用于UI中紧跟单元名称之后的简要描述文字。 例如 "Apache2 Web Server"

Documentation=
一组用空格分隔的文档URI列表, 这些文档是对此单元的详细说明。 可接受 "http://", "https://", "file:", "info:", "man:" 五种URI类型。

Wants=
此选项是 Requires= 的弱化版。 当此单元被启动时,所有这里列出的其他单元只是尽可能被启动。 但是,即使某些单元不存在或者未能启动成功, 也不会影响此单元的启动。 推荐使用此选项来设置单元之间的依赖关系。

Before=, After=
强制指定单元之间的先后顺序,接受一个空格分隔的单元列表。 假定 foo.service 单元包含 Before=bar.service 设置, 那么当两个单元都需要启动的时候, bar.service 将会一直延迟到 foo.service 启动完毕之后再启动。 注意,停止顺序与启动顺序正好相反,也就是说, 只有当 bar.service 完全停止后,才会停止 foo.service 单元。 After= 的含义与 Before= 正好相反。 假定 foo.service 单元包含 After=bar.service 设置, 那么当两个单元都需要启动的时候, foo.service 将会一直延迟到 bar.service 启动完毕之后再启动。 注意,停止顺序与启动顺序正好相反,也就是说, 只有当 foo.service 完全停止后,才会停止 bar.service 单元。 注意,此二选项仅用于指定先后顺序, 而与 Requires=, Wants=, BindsTo= 这些选项没有任何关系。 不过在实践中也经常遇见将某个单元同时设置到 After= 与 Requires= 选项中的情形。 可以多次使用此二选项,以将多个单元添加到列表中。 假定两个单元之间存在先后顺序(无论谁先谁后),并且一个要停止而另一个要启动,那么永远是"先停止后启动"的顺序。 但如果两个单元之间没有先后顺序,那么它们的停止和启动就都是相互独立的,并且是并行的。 对于不同类型的单元来说,判断启动是否已经完成的标准并不完全相同。 特别的,对于设置在 Before=/After= 中的服务单元来说, 只有在服务单元内配置的所有启动命令全部都已经被调用,并且对于每一个被调用的命令, 要么确认已经调用失败、要么确认已经成功运行的情况下, 才能认为已经完成启动。

OnFailure=
接受一个空格分隔的单元列表。 当该单元进入失败("failed")状态时, 将会启动列表中的单元。

Service小节

Type=
设置进程的启动类型, 必须设为 simple, forking, oneshot, dbus, notify, idle 之一。其中 forking , 表示 ExecStart= 进程将会在启动过程中使用 fork() 系统调用。 这是传统UNIX守护进程的经典做法。 也就是当所有的通信渠道都已建好、启动亦已成功之后, 父进程将会退出,而子进程将作为该服务的主进程继续运行。 对于此种进程, 建议同时设置 PIDFile= 选项, 以帮助 systemd 准确定位该服务的主进程, 进而加快后继单元的启动速度。

ExecStart=
在启动该服务时需要执行的命令行(命令+参数)。
ExecReload=
这是一个可选的指令, 用于设置当该服务被要求重新载入配置时所执行的命令行。
ExecStop=
这是一个可选的指令, 用于设置当该服务被要求停止时所执行的命令行。

过程

1、创建service文件

新建文件并保存

vim /usr/lib/systemd/system/jws.service

内容如下

[Unit] 
Description=Jexus web service 
Documentation=http://www.jexus.org 
Wants=network-online.target 
After=network-online.target 
 
[Service] 
User=root 
Group=root 
Type=forking 
ExecStart=/usr/jexus/jws start 
ExecStop=/usr/jexus/jws stop 
ExecReload=/usr/jexus/jws restart 
 
[Install] 
WantedBy=multi-user.target

2、尝试启动

systemctl start jws

查看状态

● jws.service - Jexus web service
   Loaded: loaded (/usr/lib/systemd/system/jws.service; disabled)
   Active: active (running) since Tue 2018-07-24 12:36:56 CST; 9s ago
     Docs: http://www.jexus.org
  Process: 26123 ExecStart=/usr/jexus/jws start (code=exited, status=0/SUCCESS)
 Main PID: 26126 (JwsMain)
   CGroup: /system.slice/jws.service
           ├─26126 mono /usr/jexus/jws.exe
           ├─26141 jexus: log service jwsLog.exe
           ├─26149 jexus: httpd worker jwsHttpd.exe
           └─26156 jexus: asp state service jwsState.exe

Jul 24 12:36:56 DynamicSvc-DEV jws[26123]: Starting ... OK
Jul 24 12:36:56 DynamicSvc-DEV systemd[1]: Started Jexus web service.

设置开启自启

systemctl enable jws
Synchronizing state for jws.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d jws defaults
Executing /usr/sbin/update-rc.d jws enable
Created symlink from /etc/systemd/system/multi-user.target.wants/jws.service to /usr/lib/systemd/system/jws.service.

引用

systemd 中文手册 译者:金步国