systemctl系统服务

  环境:centos7

  systemctl服务使用详解

实现

正常情况下我们在/usr/lib/systemd/system/目录下,创建一个以.service 后缀的文件,如cdr.service

  1. [Unit]
  2. Description=cdr
  3. After=network.target
  4.  
  5. [Service]
  6. ExecStart=/opt/pbx/cdr/cdr.py
  7. Type=forking
  8.  
  9. [Install]
  10. WantedBy=multi-user.target

使用方式:

  1. # 启动
  2. systemctl start cdr
  3. # 关闭
  4. systemctl stop cdr
  5. #查看状态
  6. systemctl status cdr
  7. #开启自启动
  8. systemctl enable cdr
  9. #关闭开启自启动
  10. systemctl enable cdr

正常的python程序都可以这么用,但是下面这种情况下,还使用上面的.servcie文件创建方式就不好使了,如下

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import logging
  4. import time
  5. import sys
  6.  
  7. logging.basicConfig(level=logging.INFO)
  8.  
  9. def daemon():
  10. import os
  11. # create - fork 1
  12. try:
  13. pid = os.fork()
  14. if pid > 0:
  15. return pid
  16. except OSError as error:
  17. logging.error('fork #1 failed: %d (%s)' % (error.errno, error.strerror))
  18. return -1
  19. # it separates the son from the father
  20. os.chdir('/opt/pbx')
  21. os.setsid()
  22. os.umask(0)
  23. # create - fork 2
  24. try:
  25. pid = os.fork()
  26. if pid > 0:
  27. return pid
  28. except OSError as error:
  29. logging.error('fork #2 failed: %d (%s)' % (error.errno, error.strerror))
  30. return -1
  31. sys.stdout.flush()
  32. sys.stderr.flush()
  33. si = open("/dev/null", 'r')
  34. so = open("/dev/null", 'a+')
  35. se = open("/dev/null", 'a+')
  36. os.dup2(si.fileno(), sys.stdin.fileno())
  37. os.dup2(so.fileno(), sys.stdout.fileno())
  38. os.dup2(se.fileno(), sys.stderr.fileno())
  39. return 0
  40.  
  41. def main():
  42. pid = daemon()
  43. if pid:
  44. return pid
  45. while True:
  46. logging.info('----------')
  47. time.sleep(1)
  48. main()

这次最大的区别就是在python程序中fork了一个子进程,这种情况下第一种方式就不好使了,经过多次测试发现下面这种方式可以实现我们的效果

  1. [Unit]
  2. Description=lzl
  3. After=network.target
  4.  
  5. [Service]
  6. Type=oneshot
  7. RemainAfterExit=yes
  8. ExecStart=/usr/bin/python3 /home/lzl/workspace/cdrservice/main.py
  9.  
  10. [Install]
  11. WantedBy=multi-user.target

  

Python开发【笔记】:python程序添加到systemctl系统服务的更多相关文章

  1. python开发笔记-python调用webservice接口

    环境描述: 操作系统版本: root@9deba54adab7:/# uname -a Linux 9deba54adab7 --generic #-Ubuntu SMP Thu Dec :: UTC ...

  2. python开发笔记-通过xml快捷获取数据

    今天在做下python开发笔记之如何通过xml快捷获取数据,下面以调取nltk语料库为例: import nltk nltk.download() showing info https://raw.g ...

  3. python开发笔记-Python3.7+Django2.2 Docker镜像搭建

    目标镜像环境介绍: 操作系统:ubuntu16.04 python版本:python 3.7.4 django版本:2.2 操作步骤: 1.  本地安装docker环境(略)2. 拉取ubunut指定 ...

  4. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  5. 使用Python开发鸿蒙设备程序(0-初体验)

    到目前为止,鸿蒙设备开发的"官方指定语言"还是C语言! 这看起来是一件正常的事,毕竟鸿蒙设备开发还是属于嵌入式开发的范畴,而在嵌入式开发中C语言又是当之无愧的首选,所以,大家也都接 ...

  6. odoo开发笔记--python获取当天时间

    取得时间相关的信息的话,要用到python time模块,python time模块里面有很多非常好用的功能,你可以去官方文档了解下,要取的当前时间的话,要取得当前时间的时间戳,时间戳好像是1970年 ...

  7. 【Python开发】python集成开发环境IDE搭建

    http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件 Ubuntu / windows Python 2.7 / pytho ...

  8. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  9. python开发_IDEL(Python GUI)的使用方法

    在这篇blog"Python开发_python的安装"里面你会了解到python的安装. 安装后,我们希望能够运用python GUI来运行一些我们编写的程序,那么Python G ...

随机推荐

  1. 判断资源贴图是否有alpha

    /* modfly selected textures`s maxSize and ImportFormat bool hasAlpha = true; if(hasAlpha)then(textur ...

  2. N76E003之WDT(看门狗定时器)

    N76E003提供一个看门狗定时器(WDT),它可以配置成一个超时复位定时器用于复位整个设备.一旦由于外界干扰设备进入非正常状态或挂起,看门狗可以复位恢复系统.这有用于监测系统运行以提高系统可靠性.对 ...

  3. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  4. 使用JDBC插入数据到ORACLE,使用标识列自增列

    不同于SQL Server的是,Oracle中插入数据的时候,没有自增列或者是标识列,但是,我们又不想显式的进行主键的插入,这里,必须在Oracle数据库中指定一个标识列,或者说是一个序列.具体方法如 ...

  5. 【大数据系列】HDFS初识

    一.HDFS介绍 HDFS为了做到可靠性(reliability)创建了多分数据块(data blocks)的复制(replicas),并将它们放置在服务集群的计算节点中(compute nodes) ...

  6. Android JNI与多线程

    Java通过JNI调用本地C++代码是在同一个线程中的同步调用. JNI中如果新建的线程调用java的代码,那么java代码是运行在JNI线程中的:但是,如果调用UI相关的代码时需要与java主线程通 ...

  7. Android SAX、DOM、Pull解析xml文件剖析与案例讲解

    XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...

  8. C# DataView操作DataTable

    1.DataView筛选数据 //假设有一个DataTable数据 DataTable dt = new DataTable(); //DataTable转成DefaultView DataView ...

  9. PS-CC常用快捷键总结

    灵活使用photoshop软件快捷键是学好该软件的基础,ps快捷键对于ps平时操作有很大帮助 熟练掌握ps的快捷键可以为了处理图片节省很多时间.现在笔者将自己平时常用的快捷键总结如下: 移动工具[V] ...

  10. 用ELK打造可视化集中式日志

    原文链接:https://yq.aliyun.com/articles/57420 摘要: Elk是Elastic search, Logstash和Kibana三者的简称. Elastic sear ...