Colab 背後仰賴一個跑 Linux 的虛擬機器執行你的 Python 程式,如果要測試一些後端程式,其實也是沒有問題,尤其即使是免費用戶,也可以打開終端機直接操作背後的作業系統,非常方便。本文介紹在測試後端程式時常會需要在背景執行程式的方法。
直接開終端機下指令
要在背景執行指令,最簡單的方法就是開啟終端機下指令,例如:
/content# sleep 10 &
[1] 7542
/content#
指令看起來會立即結束,如果以 ps 指令檢查,就會看到在背景執行的指令:
/content# ps -eo pid,command | grep sleep
7542 sleep 10
7554 sleep 1
7556 grep --color=auto sleep
/content#
等它結束後再度查詢:
/content# ps -eo pid,command | grep sleep
7644 sleep 1
7646 grep --color=auto sleep
[1]+ Done sleep 10
/content#
就會看到原本在背景執行的 sleep 10 已經不見了,而在查詢指令結束後,也會出現已經結束的背景程式資訊。
使用 ! 執行指令
Colab 本質是 Jupyter,提供有 ! 特殊命令可以執行系統指令,所以理論上可以 !sleep 10 & 這樣執行背景程式:
但你會發現儲存格會一直處在執行中狀態,直到背景程式結束:
你會看到儲存格的執行時間是 10 秒,這使得背景程式執行時無法執行其他儲存格。會發生這樣的狀況,是因為 ! 必須捕捉所執行程式的輸出,以便能夠顯示在儲存格的輸出區域,所以即使是以背景方式執行程式,但仍持續捕捉它的輸出,所以儲存格就會停留在執行中的狀態。
要解決這個問題,最直接的方式就是把背景程式的輸出轉向,例如 !sleep 10 >/dev/null 2>&1 &:
你可以看到這裡儲存格的執行時間是 0 秒,也就是執行儲存格後就會離開執行中的狀態,即使背景程式仍在執行中,這樣就可以在背景執行必要的程式,但又可以執行其他儲存格了。要特別注意的是,轉向時,要把標準輸出以及標準錯誤都一併轉向。
上述指令是把輸出都轉向到 Linux 的黑洞檔案 /dev/null 中,所以完全無法看到背景程式的輸出貨錯誤訊息。如果需要看到輸出結果,也可以轉向到任一檔案,例如 ! python -c "print 'hello'" > out.log 2>&1 &:
就可以看到背景程式有噴出錯誤訊息,對於需要檢視後端程式輸出或除錯很有幫助。
使用 nohup 協助轉向
如果覺得上述輸出轉向語法有點複雜,也可以透過 nohup 指令自動處理,這個指令原本是為了讓你可以在執行即使斷開當前終端機連線也會繼續執行的背景程式。前述的背景程式執行方法,會在你離開當前終端機階段(關閉終端機或是結束 ssh 連線等,稱為 hang up,也是掛斷電話的意思)時一併結束,nohangup 代表 "no hnag up",表示不理會掛斷。nohup 會幫你把輸出轉向到 nohup.out 檔,例如 !nohup sleep 10 &:
執行後唯一的輸出就是告知輸出轉向檔案的訊息。
要注意的是,! 一樣會把儲存格輸出區的輸入轉向給執行的指令,如果沒有加上 & 指定在背景執行,斷開儲存格輸入與指令的連結,一樣會處於等待輸入的狀態,像是 !nohup sleep 10:
就無法執行其他儲存格了。






Top comments (0)