一個用python寫的監控腳本test1.py,用while True方式一直運行,在ssh遠端(使用putty終端)時透過以下命令啟動腳本:
程式碼如下:
python test1.py &
現在腳本正常運行,透過ps能看到進程號,此時直接關閉ssh終端機(不是用exit指令,是直接透過putty的關閉按鈕執行的), 再次登入後發現進程已經退出了。
透過後台啟動的方式該問題已經解決,這裡總結下,也方便我以後查閱。
linux 下後台運行
透過fork實作
linux環境下,在c中守護程式是透過fork方式實現的, python也可以透過該方式實現,範例程式碼如下:
程式碼如下:
#!/usr/bin/env python import time,platform import os def funzioneDemo(): # 这是具体业务函数示例 fout = open('/tmp/demone.log', 'w') while True: fout.write(time.ctime()+'\n') fout.flush() time.sleep(2) fout.close() def createDaemon(): # fork进程 try: if os.fork() > 0: os._exit(0) except OSError, error: print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror) os._exit(1) os.chdir('/') os.setsid() os.umask(0) try: pid = os.fork() if pid > 0: print 'Daemon PID %d' % pid os._exit(0) except OSError, error: print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror) os._exit(1) # 重定向标准IO sys.stdout.flush() sys.stderr.flush() si = file("/dev/null", 'r') so = file("/dev/null", 'a+') se = file("/dev/null", 'a+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) # 在子进程中执行代码 funzioneDemo() # function demo if name == 'main': if platform.system() == "Linux": createDaemon() else: os._exit(0)
透過upstart方式實作
可以透過upstart把應用程式封裝成系統服務,這裡直接記錄下完整範例。
1、寫python腳本
程式碼如下:
[root@local t27] # cat test123.py #!/usr/bin/env python import os,time while True : print time.time() time.sleep(1)
[root@local t27] # cat /etc/init/mikeTest.confdescription "My test"author "Mike_Zhang@live.com" start on runlevel [234]stop on runlevel [0156] chdir /test/t27exec /test/t27/test123.pyrespawn
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]#
透過bash腳本實作
透過bash腳本實現
[root@local test]# cat test123.py#!/usr/bin/env python import os,time while True : print time.time() time.sleep(1)
程式碼如下:
[root@local test]# cat start.sh#! /bin/sh python test123.py &
程式碼如下:
3、啟動進程
[root@local test]#./start.sh
python test123.py &
<><直接用&啟動進程:
程式碼如下:
直接關閉ssh終端會導致進程退出。透過screen、tmux等方式實現
如果臨時跑程序的話,可以透過screen、tmux啟動程序,這裡描述下tmux啟動的方式。
1、啟動tmux
在終端輸入tmux即可啟動
2、在tmux中啟動程序
直接執行以下指令即可(腳本參考上面的): python test123.py
3、直接關閉ssh終端機(例如putty上的關閉按鈕);
tmux attach
程式碼如下:
現在可以看到python程式還在正常執行。
windows下後台運行