python做Linux进程运行,Python实现在Linux系统下更改当前进程运行用户
在上一篇文章中,我們講了如何在linux上用python寫一個守護進程。主要原理是利用linux的fork函數(shù)來創(chuàng)建一個進程,然后退出父進程運行,生成的子進程就會成為一個守護進程。細心觀察的可能會發(fā)現(xiàn),這個守護進程的運行身份是執(zhí)行這個程序的用戶,如果把這個守護程序加入到系統(tǒng)的服務項,那么這個守護程序的執(zhí)行身份應該是root。
一個情況出現(xiàn)了,root的權限比較大,如果通過這個root身份的守護程序來進行操作,危險性是比較大的。一種好的辦法是生成一個身份為root的master進程用來接受請求,生成若干個woker進程用來處理請求,這樣就不會出現(xiàn)權限過大問題。事實上,現(xiàn)在很多軟件,nginx,mysql,apache,vsftpd等幾乎都是這樣做的。
那么,怎么樣在linux中更改子進程的運行身份呢?,實際上linux提供了這樣的函數(shù),來看一下python代碼:
#!/usr/bin/env python
import time,os,pwd,sys,signal
logfile="/tmp/d2.log"
#step one, get the username you want to running with
try:
user=sys.argv[1]
except:
user=raw_input(‘Please input a username in this machine you want to run this program: ‘)
if user=="":sys.exit(-1)
try:
uid=pwd.getpwnam(user)
uid=uid.pw_uid
except:
print "Uer not exists!"
sys.exit(-1)
#step two:Generation of daemon
pid=os.fork()
if(pid):sys.exit(0)
os.setsid()
os.chdir("/")
os.umask(0)
#step three :fork again
pid=os.fork()
if(pid==0):
os.setuid(uid)
os.setsid()
os.chdir("/")
os.umask(0)
log=open(logfile,‘a(chǎn)‘)
log.write(‘Daemon start up at %s\n‘%(time.strftime(‘%Y:%m:%d‘,time.localtime(time.time()))))
log.close()
def reload(a,b):
log=open(logfile,‘a(chǎn)‘)
log.write(‘Daemon reload at %s\n‘%(time.strftime(‘%Y:%m:%d‘,time.localtime(time.time()))))
log.close()
while True:
signal.signal(signal.SIGHUP,reload)
time.sleep(2)
運行這個程序,輸入nginx(nginx為系統(tǒng)中已經(jīng)添加的用戶),然后用ps aux|grep python查看系統(tǒng)當中運行的python程序,可以看到,有一個woker進程的身份已經(jīng)改變了成為nginx了:
[[email?protected] ~]# ps aux|grep python
root 1139 0.0 0.5 5288 2372 ? Ss 22:40 0:00 python ./d2.py nginx
nginx 1140 0.0 0.5 5288 2360 ? S 22:40 0:00 python ./d2.py nginx
root 1151 0.0 0.1 2336 648 pts/0 S+ 22:50 0:00 grep python
因為身份為nginx的進程是用來處理請求的,那么一些屬于root的權限就不會被進程調(diào)用,也可以通過設置文件的權限,對進程操作單個文件進行限制,達到比較好的權限控制效果,減少安全隱患。
原文:http://www.jb51.net/article/60725.htm
總結
以上是生活随笔為你收集整理的python做Linux进程运行,Python实现在Linux系统下更改当前进程运行用户的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux校园网电脑开wifi密码,Li
- 下一篇: linux 输出gc日志,Tomcat输