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 subprocess
def 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是逐个第二列的号码,即PID
cmd = "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}'`