如果要在Linux 上设置一个开机自启,出现问题自动重启,并且有良好日志的程序,比较流行的方法有 supervisord、systemd,除此之外,还有 upstart、runit 等类似的工具。

但是自从 systemd 被 ubuntu、centos 等主流 Linux 发行版应用以来,systemd 渐渐成为主流方案。

配置说明

要自定义一个服务,需要在 /usr/lib/systemd/system/ 下添加一个配置文件:<software-name>.service

如果 /usr/lib/systemd/system/ 不存在,可考虑使用 /lib/systemd/system//etc/systemd/system/

配置文件的内容说明:

[Unit]: 服务的启动顺序与依赖关系
Description: 当前服务的简单描述
After: 当前服务(<software-name>.service)需要在这些服务启动后,才启动
Before: 和 After 相反,当前服务需要在这些服务启动前,先启动
Wants:表示当前服务"弱依赖"于这些服务。即当前服务依赖于它们,但是没有它们,当前服务也能正常运行。
Requires: 表示"强依赖"关系,即如果该服务启动失败或异常退出,那么当前服务也必须退出。 [Service] 服务运行参数的设置
Type=forking 后台运行的形式
PIDFile=/software-name/pid pid文件路径
EnvironmentFile=/xxx/prod.env 通过文件设定环境变量
WorkingDirectory=/xxx/xxx 工作目录
ExecStartPre 启动前要做什么(为启动做准备)
ExecStart 服务的具体运行命令(对非 workingdirectory 的文件,必须用绝对路径!因为 systemd 不使用 shell,也就不查找 PATH)
ExecReload 重载命令
ExecStop 停止命令
ExecStartPre:启动服务之前执行的命令
ExecStartPost:启动服务之后执行的命令
ExecStopPost:停止服务之后执行的命令
RuntimeDirectory=xxxx
RuntimeDirectoryMode=0775
PrivateTmp=True 表示给服务分配独立的临时空间
RestartSec 自动重启当前服务间隔的秒数
Restart 定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure 等
# 程序的 user 和 group
User=ryan
Group=ryan 注意:启动、重载、停止命令全部要求使用绝对路径 [Install] 定义如何安装这个配置文件,即怎样做到开机启动。
# Target的含义是服务组,表示一组服务。
WantedBy=multi-user.target

注意,service 文件不支持行内注释!!!注释必须单独一行

Type 说明

  1. Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。

  2. Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。

  3. Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态

  4. Type=notify:与 Type=simple相同,但约定服务会在就绪后向systemd发送一个信号。这一通知的实现由 libsystemd-daemon.so提供。

  5. Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

更详细的见 Systemd 入门教程:命令篇 - 阮一峰

配置举例

比如 shadows*ks Server Service,的配置文件 ss-server.service 的内容为:

[Unit]
Description=ss Server Service
After=network.target [Service]
Type=simple
User=nobody
ExecStart=/usr/bin/ssserver -c /etc/ss/ss.json -d start
ExecStop=/usr/bin/ssserver -c /etc/ss/ss.json -d stop [Install]
WantedBy=multi-user.target

而 enginx 的配置文件 nginx.service 的内容是:

[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target [Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop [Install]
WantedBy=multi-user.target

服务的启动、关闭

systemctl enable ss-server.service  # 启用服务,即开机自动启动
systemctl disable ss-server.service # 取消服务,取消开机启动 systemctl start ss-server.service # 启动服务
systemctl stop ss-server.service # 停止服务 systemctl restart ss-server.service # 重启服务(stop + start)
systemctl reload ss-server.service # 服务不 stop,直接加载配置更新等(对应 ExecReload) # 检查状态
systemctl status ss-server.service -l systemctl list-units --type=service # 查看所有服务

参考

通过 systemctl 设置自定义 Service的更多相关文章

  1. CentOS7+Nginx设置Systemctl restart nginx.service服务

    centos 7上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度.关于 ...

  2. Centos7 设置自定义安装nginx的systemctl启动方式

    一.systemctl方式启动设置过程 1.首先创建服务配置文件(名字和路径就是这个) vim /usr/lib/systemd/system/nginx.service 2.添加配置内容 [Unit ...

  3. 在linux下创建自定义service服务

    三个部分 这个脚本分为3个部分:[Unit] [Service] [Install]. Unit Unit表明该服务的描述,类型描述.我们称之为一个单元.比较典型的情况是单元A要求在单元B启动之后再启 ...

  4. CentOS 7.x设置自定义开机启动,添加自定义系统服务

    Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即: /l ...

  5. systemd添加自定义系统服务设置自定义开机启动

    1.服务权限 systemd有系统和用户区分:系统(/user/lib/systemd/system/).用户(/etc/lib/systemd/user/).一般系统管理员手工创建的单元文件建议存放 ...

  6. CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制

    遇到的问题: golang程序一直出现 too many open files的报错, 尽管对 /etc/security/limits.conf 做了设置, 对最大文件打开数,最大进程数做了调优. ...

  7. Ambari安装及自定义service初步实现

    Ambari安装 1 Ambari简介 Apache Ambari项目的目的是通过开发软件来配置.监控和管理hadoop集群,以使hadoop的管理更加简单.同时,ambari也提供了一个基于它自身R ...

  8. 【转】CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制

    在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 在centos 5/6 等 ...

  9. Centos7下的systemctl命令与service和chkconfig

    博主使用的操作系统是最新的CentOS 7,所以可能和网上一些老的博文有一定出入,那是因为版本更新的原因. 这里写图片描述1 service service命令用于对系统服务进行管理,比如启动(sta ...

随机推荐

  1. webpack——安装报错及解决办法

    ①先删除 删除全局webpack-cli webpack4.x开始官方文档是说要安装cli所以如果的在用4.+就需要卸载cli npm uninstall -g webpack-cli # 注释给我这 ...

  2. python的格式化输出(format,%)

    皇城PK Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是format这根本就不算个问 ...

  3. SpringBoot非官方教程 | 第十二篇:springboot集成apidoc

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-apidoc/ 本文出自方志朋的博客 首先声明下 ...

  4. C++ string和int相互转换

    首先需要C++ 11的支持 打开devC++,点击tools,点击编译环境,然后出现的框第一个勾选,输入-std=c++11即可 然后使用 to_string() 和 atoi() 就可以轻松实现其相 ...

  5. Mysql存储过程查询结果赋值到变量

    # 使用的navicat  编辑的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_student_back`()BEGIN#定义max ...

  6. spring配置多个视图解析

    <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceVie ...

  7. checkbox的第三种状态--不确定状态

    视觉上,checkbox有三种状态:checked.unchecked.indeterminate(不确定的).看起来就像这样子:

  8. php使用file_get_contents 或者curl 发送get/post 请求 的方法总结

    file_get_contents模拟GET/POST请求 模拟GET请求: <?php $data = array( 'name'=>'zhezhao', 'age'=>'23' ...

  9. hadoop生态搭建(3节点)-07.hive配置

    # http://archive.apache.org/dist/hive/hive-2.1.1/ # ================================================ ...

  10. Flask初学者:视图函数和类视图

    当一个url请求进入后台时,一般有两种方式来进行处理:视图函数和类视图.视图函数直接使用一个函数来进行处理并返回数据给浏览器,类视图则是使用类来进行处理并返回的,所以当需要进行的处理比较简单,则可以考 ...