問題描述:
環境: centos6.4
乙個用python寫的監控指令碼test1.py,用while true方式一直執行,在ssh遠端(使用putty終端)時通過以下命令啟動指令碼:
python test1.py &
現在指令碼正常執行,通過ps能看到程序號,此時直接關閉ssh終端(不是用exit命令,是直接通過putty的關閉按鈕執行的), 再次登入後發現程序已經退出了。
通過後台啟動的方式該問題已經解決,這裡總結下,也方便我以後查閱。
linux環境下,在c中守護程序是通過fork方式實現的,python也可以通過該方式實現,示例**如下:
1#!/usr/bin/env python2#
e-mail : [email protected]
3import
time,platform
4importos5
6def
funzionedemo():7#
這是具體業務函式示例
8 fout = open('
/tmp/demone.log
', 'w'
)9while
true:
10 fout.write(time.ctime()+'\n'
)11fout.flush()
12 time.sleep(2)
13fout.close()
1415
defcreatedaemon():16#
fork程序
17try:18
if os.fork() >0: os._exit(0)
19except
oserror, error:
20print
'fork #1 failed: %d (%s)
' %(error.errno, error.strerror)
21 os._exit(1)
22 os.chdir('/'
)23os.setsid()
24os.umask(0)
25try
:26 pid =os.fork()
27if pid >0:
28print
'daemon pid %d
' %pid
29os._exit(0)
30except
oserror, error:
31print
'fork #2 failed: %d (%s)
' %(error.errno, error.strerror)
32 os._exit(1)33#
重定向標準io
34sys.stdout.flush()
35sys.stderr.flush()
36 si = file("
/dev/null
", 'r'
)37 so = file("
/dev/null
", 'a+'
)38 se = file("
/dev/null
", 'a+'
, 0)
39os.dup2(si.fileno(), sys.stdin.fileno())
40os.dup2(so.fileno(), sys.stdout.fileno())
41os.dup2(se.fileno(), sys.stderr.fileno())
4243
#在子程序中執行**
44 funzionedemo() #
function demo
4546
if__name__ == '
__main__':
47if platform.system() == "
linux":
48createdaemon()
49else
:50 os._exit(0)
可以通過upstart把應用封裝成系統服務,這裡直接記錄下完整示例。
1、編寫python指令碼
[root@local t27]# cat test123.py
#!/usr/bin/env python
import os,time
while true :
print time.time()
time.sleep(1)
2、編寫upstat配置檔案
[root@local t27]# cat /etc/init/miketest.conf
description "my test"
author "[email protected]"
start on runlevel [234]
stop on runlevel [0156]
chdir /test/t27
exec /test/t27/test123.py
respawn
initctl reload-configuration
4、啟動服務
[root@local t27]# start miketest
miketest start/running, process 6635
[root@local t27]# ps aux | grep test123.py
root 6635 0.0 0.0 22448 3716 ? ss 09:55 0:00 python /test/t27/test123.py
root 6677 0.0 0.0 103212 752 pts/1 s+ 09:56 0:00 grep test123.py
5、停止服務
[root@local t27]# stop miketest
miketest stop/waiting
[root@local t27]# ps aux | grep test123.py
root 6696 0.0 0.0 103212 752 pts/1 s+ 09:56 0:00 grep test123.py
[root@local t27]#
1、python**
[root@local test]# cat test123.py
#!/usr/bin/env python
import os,time
while true :
print time.time()
time.sleep(1)
2、編寫啟動指令碼
[root@local test]# cat start.sh
#! /bin/sh
python test123.py &
3、啟動程序
[root@local test]#./start.sh
如果直接用&啟動程序:
python test123.py &
直接關閉ssh終端會導致程序退出。
如果臨時跑程式的話,可以通過screen、tmux啟動程式,這裡描述下tmux啟動的方式。
1、啟動tmux
在終端輸入tmux即可啟動
2、在tmux中啟動程式
3、直接關閉ssh終端(比如putty上的關閉按鈕);
4、重新ssh上去之後,執行如下命令:
tmux attach
現在可以看到python程式還在正常執行。
在windows下沒有深入的研究過,我經常用的方法是修改python指令碼的擴充套件名為".pyw",雙擊即可後台執行,不需要修改任何**。
執行python指令碼後台執行
加了 以後可以使指令碼在後台執行,這樣的話你就可以繼續工作了。但是有乙個問題就是你關閉終端連線後,指令碼會停止執行 python3 run.py dev null 2 1 nohup python3 run.py dev null 2 1 注意print有輸出緩衝,使用 u引數,使得python不啟...
執行python指令碼後台執行
在linux中,可以使用nohup將指令碼放置後台執行,如下 nohup python myscript.py params1 nohup.out 2 1 但直接使用上面 無法在程式執行過程中檢視python中的print computing 輸出結果,比如在每次迴圈中使用print語句等。原因是p...
執行python指令碼後台執行
在linux中,可以使用nohup將指令碼放置後台執行,如下 nohup python myscript.py params1 nohup.out 2 1 但直接使用上面 無法在程式執行過程中檢視python中的print computing 輸出結果,比如在每次迴圈中使用print語句等。原因是p...