場景
python 程式碼,列印1~3000,每秒列印一次
## file_name: test.py import time i = 0 while 1: time.sleep(1) i = i + 1 print(i) if i > 3000: break
問題:直接在終端執行:python test.py, 需要在這個終端一直等,沒法幹別的事了。如何讓程式碼在後端執行?
&——讓命令後臺執行
python test.py &
在命令後面加&,可以讓命令在後臺執行
問題:列印的東西還是會在終端顯示,這明顯干擾正常的工作啊,如何把列印的東西打打到指定的檔案?
>——輸出重定向
python test.py >out.txt &
這樣就會把輸出列印到out.txt
問題:如果中間發生了異常,錯誤資訊就丟啦,比如下面的程式碼,如何把錯誤資訊也列印到out.txt呢?
import time i = 0 while 1: time.sleep(1) i = i + 1 print(i) if i == 10: i = i / 0 if i > 3000: break
2>&1 ——將標準出錯重定向到標準輸出
python test.py > out.txt 2>&1 &
執行可以看到錯誤
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
File "test.py", line 8, in <module>
i = i / 0
ZeroDivisionError: integer division or modulo by zero
歐耶,搞定,書歸正傳,把異常程式碼幹掉繼續
問題:關閉本終端,後臺程式終止了,尷尬。如何在關閉本終端是程式可以依然執行
nohup——退出終端後,程式依然後臺執行
nohup python test.py > out.txt 2>&1 &
關閉終端,再重新進入終端,可以可以看到程式是或者的,目前檢視程式存活的方式是ps -ef | grep test。
問題:能否有專門的命令,看到所有後臺執行的命令
jobs——檢視後臺執行的程式
$ jobs [1]+ Running nohup python test.py > out.txt 2>&1 &
如果有多個呢?再起一個類似的後臺程式test2, test3,另外把具體的pid也打出來
[1] 192415 Running nohup python test.py > out.txt 2>&1 & [2]- 192646 Running nohup python test2.py > out.txt 2>&1 & [3]+ 192647 Running nohup python test3.py > out.txt 2>&1 &
可以看到,[1][2][3]後面的狀態是不同的,最後啟動的放在最後邊
問題:怎麼把後臺執行的命令重新調到前端執行呢?
fg——把後臺執行的命令
$ fg nohup python test3.py > out.txt 2>&1
可以看到調入前臺重新執行的是[3]+, 狀態是+的。 剛才jobs裡的能否指定某一個呢,可以的
$ fg %1 nohup python test.py > out.txt 2>&1
注意:%1, 中間沒有空格,1,就是上面的[1]編號
如何把調入前臺執行的命令終止呢?Ctrl + C
問題:如何暫停某個程式?
Ctrl+z——暫停某個程式
目前在執行test, Ctrl+Z暫停,然後看看現在程式的狀態
$ jobs [1]+ Stopped nohup python test.py > out.txt 2>&1 [2]- Running nohup python test2.py > out.txt 2>&1 &
問題:如何繼續執行暫停的程式
bg——繼續執行後臺暫停的程式
$ bg %1 [1]+ nohup python test.py > out.py 2>&1 & t$ jobs [1]- Running nohup python test.py > out.py 2>&1 & [2]+ Running nohup python test2.py > out.py 2>&1 &
問題:是繼續執行,還是重新執行呢?
繼續執行,以下程式碼驗證下
import time import datetime i = 0 while 1: time.sleep(1) i = i + 1 print(i) now = datetime.datetime.now() print(now.strftime('%a, %b %d %H:%M:%S')) if i > 3000: break
可以看到在列印到20後,是暫停的,後面執行時,數字接著執行,如果是這樣感覺這個命令好強大
除了程式執行結束,如何殺死程式
kil——終止程式
根據jobs -l 得到的程式號,直接kill pid 或者 kill jobno (這裡的jobno是[]中的數字)