python 後臺運行

Python 後臺運行

關於Python後臺運行,查找了很多資料,配合Tornado後端庫來實現。


首先聊一聊Linux中,關於後臺和前臺的問題。

當前狀態下,執行了一條阻塞型命令(apt update或是yum update)時,我們無法再這條命令執行的基礎上,再執行命令。當然&&是類似於消息隊列,之前的命令完成(無論狀態)之後再執行。

而後臺便是一種類似併發,可以同時執行多條指令。這此之上,可以將重定向輸出。

# -*- coding:utf-8 -*-


def run():
    print("run 1")
    import time
    for i in range(100):
    	time.sleep(1)
        print(i)
    
    
if __name__ == '__main__':
    run()

當我們有一個python文件(名字run.py

使用python3 run.py的時候,這個程序將會在終端中輸出數字(1-100)的同時休息1秒。除非我們ctrl+c終止,或者ctrl+z移至後臺。

但是對於後端程序而言,ctrl+z將會把程序放入後臺,並且處於暫停狀態。


  1. 第一種:後臺不暫停掛起方式(安利)

    # 原命令
    >>> python3 run.py
    
    # 在執行程序時,添加命令
    >>> nohup python3 run.py > my.log &
    

    nohup不掛斷運行命令

    &後臺運行

    >將程序輸出結果重定向輸出到my.log日誌中,若不指定日至文件,將使用默認nohup.out

    直接用./sh文件就可以運行

    但是如果想後臺運行,即使關閉當前的終端也可以運行的話,需要nohup命令和&命令。


  2. 第二種:使用python-daemon方式

    pip3 install python-daemon
    

    寫一個新的py文件(名字:run2)

    import daemon
    from run import run 
    
    with daemon.DaemonContext():
        run()
    

    然後python3 run2.py


  3. 第三種:ctrl+z+bg指令

    # ctrl+z將前臺運行的程序放入後臺掛起
    time@time:~$ python3 run.py 
    runing
    0
    1
    2
    ^Z
    [1]+  已停止               python3 run.py
    time@time:~$ 
    
    # 使用bg %jubnum 方式繼續運行
    time@time:~$ bg 1
    [1]+ python3 run.py &
    time@time:~$ 3
    4
    5
    6
    7
    8
    9
    10
    ...
    

    如果這樣做,那麼輸出結果將繼續佔用終端,ctrl+z將無法後臺運行


    原因在於:bg指令本身是將後臺暫停的程序繼續運行,但並不是將程序本身從後臺調至前臺。所以佔用終端的不是程序本身,而是輸出結果。

    有一種很煩人的做法,讓當前終端都處於一種ctrl+c都無法終止的情況

    # ctrl+z將前臺運行的程序放入後臺掛起
    time@time:~$ python3 run.py 
    runing
    0
    1
    2
    ^Z
    [1]+  已停止               python3 run.py
    du@du-GL553VD:~$ 
    

    依舊這樣做,但在bg 1的時候,重定向輸出結果……

    time@time:~$ bg 1 > my.log
    # 或 
    time@time:~$ bg 1 > my.log &
    

    除非關閉終端,讓我們肉眼無法看到……???

    ***請不要在有實時輸出的情況下用這種方式,不然連條命令寫都寫不了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章