首页 > 技术文章 > 编写脚本,编写.service服务的问题

yungjinzhou 2020-12-31 18:01 原文

编辑配置service文件问题

问题描述:
写.service文件后,运行systemctl stop pro.serivce,卡住

尝试1.

[Service]
Type=forking
NotifyAccess=all
TimeoutStartSec=0
User=root
ExecStart=/usr/bin/project_start.sh start

可以正常启动

但是重启和停止会卡住

尝试2

[Service]
Type=forking
NotifyAccess=all
TimeoutStartSec=0
User=root
ExecStart=/usr/bin/project_start.sh start
ExecStop=/usr/bin/project_start.sh stop
ExecRestart=/usr/bin/project_start.sh restart

可以正常启动一次,正常停止一次,再次启动报错,uwsgi.log中 uwsgi no app load

尝试3

[Service]
Type=simple
NotifyAccess=all
TimeoutStartSec=0
User=root
ExecStart=/usr/bin/project_start.sh start
ExecStop=/usr/bin/project_start.sh stop
ExecRestart=/usr/bin/project_start.sh restart




[Service]
Type=forking
NotifyAccess=all
TimeoutStartSec=0
User=root
ExecStart=/usr/local/bin/uwsgi --ini /usr/lib/python3.6/site-packages/project_django/deploy/uwsgi_deploy.ini
ExecStop=/usr/local/bin/uwsgi --stop /var/run/project_django.pid
ExecRestart=/usr/local/bin/uwsgi --reload /var/run/project_django.pid


启动提示unable to load app 0 (mountpoint='') (callable not found or import error)

加上pidfile,在forking类型可以正常stop

[Unit]
Description=mimic uwsgi service

[Service]
Type=forking
PIDFile=/var/run/project_django.pid
NotifyAccess=all
TimeoutStartSec=0
User=root
ExecStart=/usr/bin/django_project.sh start
ExecReload=/usr/bin/django_project.sh restart
ExecStop=/usr/bin/django_project.sh stop

ExecStopPost=ps aux | grep uwsgi_deploy | grep -v grep | awk '{print $2}' | xargs kill -9

ExecStartPre=/usr/bin/django_project.sh start

[Install]
WantedBy=multi-user.target

参考:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

https://blog.51cto.com/gaowenlong/1715070

当只是执行一个脚本,不涉及服务如uwsgi、celery等,type可以用simple

当执行的脚本需要运行服务,选forking, 并且指定pidfile项

Type=oneshot 这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify 与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus 若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。
Type=forking systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程
Type=simple (默认值) systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。

推荐阅读