python指令碼後台執行

2022-02-10 04:12:13 字數 4069 閱讀 2225

問題描述:

環境: 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...