ps ajx
可以看到如下界面:
在TPGID一列,数值为-1的,均是脱离终端的守护进程
os.system(command)
如下代码可以实现效果如同 ls
import os os.system('ls')
daemonize是创建守护一个进程的过程.其中包括:
#!/usr/bin/env python
#coding: utf-8
import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了
''' def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): #重定向标准文件描述符(默认情况下定向到/dev/null) try: pid = os.fork() #父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。 if pid > 0: sys.exit(0) #父进程退出 except OSError, e: sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) ) sys.exit(1) #从母体环境脱离 os.chdir("/") #chdir确认进程不保持任何目录于使用状态,否则不能umount一个文件系统。也可以改变到对于守护程序运行重要的文件所在目录 os.umask(0) #调用umask(0)以便拥有对于写的任何东西的完全控制,因为有时不知道继承了什么样的umask。 os.setsid() #setsid调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。 #执行第二次fork try: pid = os.fork() if pid > 0: sys.exit(0) #第二个父进程退出 except OSError, e: sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) ) sys.exit(1) #进程已经是守护进程了,重定向标准文件描述符 for f in sys.stdout, sys.stderr: f.flush() si = open(stdin, 'r') so = open(stdout, 'a+') se = open(stderr, 'a+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) #dup2函数原子化关闭和复制文件描述符 os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) #示例函数:每秒打印一个数字和时间戳
def main(): import time sys.stdout.write('Daemon started with pid %d\n' % os.getpid()) sys.stdout.write('Daemon stdout output\n') sys.stderr.write('Daemon stderr output\n') c = 0 while True: sys.stdout.write('%d: %s\n' %(c, time.ctime())) sys.stdout.flush() c = c+1 time.sleep(3) if __name__ == "__main__": daemonize('/dev/null','/tmp/daemon_stdout.log','/tmp/daemon_error.log') main()
ps -ef | grep pre_deal
查看后台运行的这个进程此时给该文件权限并执行后.查看进程可以看见一个python且,TPGID为-1的守护进程,输出文件也在输出.
比较简单:
#/bin/bash
./pre_deal.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-import os
import sys
import time
import subprocessdef start():os.system("./a")def stop():# count = "ps -ef | grep 'pre_deal' | grep 'bin/' | grep -v 'grep' | wc -l"count = "ps -ef | grep 'pre_deal' | grep -v 'grep' | wc -l" #统计有几行任务process = subprocess.Popen(count, stdin=None, stdout=subprocess.PIPE,stderr=None, shell=True)cnt = process.stdout.read()if int(cnt):#此时,cmd是逐个第二列的号码,即PIDcmd = "ps -ef | grep 'pre_deal' | grep -v 'grep' | kill -9 `awk '{print $2}'`"subprocess.Popen(cmd, stdin=None, stdout=None, stderr=None, shell=True)# print "All the platform daemons have been stopped."if __name__ == "__main__":input_idx = input("请输入1: ")if input_idx == 1 :stop()start()elif input_idx == 2 :start()else:print("输入错误")sys.exit(2)sys.exit(0)
wc -l
统计行数,即统计有几个进程ps -ef | grep 'pre_deal' | grep -v 'grep' | wc -l
awk...print $2
列出第二列的PID,用以杀掉,最后执行kill -9 将这几个与pre_deal有关的进程杀掉,即为关闭ps -ef | grep 'pre_deal' | grep -v 'grep' | kill -9 `awk '{print $2}'`