Linux——Django 測試伺服器在後台運行......某處

Linux——Django 測試伺服器在後台運行......某處

我在 Vista 機器上使用 Putty 登入到我的開發伺服器 (Ubuntu) 並啟動了 Django 測試伺服器。它運行一個類似 apache 的伺服器來測試我的網頁應用程式。該應用程式在我的內部 IP 位址的連接埠 8080 上運行192.168.0.130:8080

我離開電腦一段時間(物理上),然後回來發現 Putty 連接已逾時。沒什麼大不了的,我剛剛重新登入伺服器。但是,當我現在嘗試運行 Django 測試伺服器時,它說該連接埠已在使用中。這意味著(我認為)第一個測試伺服器實例仍在連接埠 8080 上運行。

我如何殺死這個進程?這個過程到底是什麼樣的?我做了一個ps aux,感覺這是一個令人反感的過程:

garfonzo    5719  0.3  0.0      0     0 ?        D    08:58   1:07 [python]

因為我今天早上大約在那個時間啟動了伺服器,而 Django 是基於 python 的。然而,執行 akill 5719沒有任何作用——進程沒有被終止,我仍然無法啟動測試伺服器。

有任何想法嗎!

編輯- 更多細節:

我也跑了netstat -tulpn,輸出是這樣的:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.1.130:8080      0.0.0.0:*               LISTEN      -

是不是很方便啊,我想知道進程ID的那個連接埠沒有PID啊!

答案1

如果您非常有信心這是正確的過程(這似乎是可能的) - 並且由於 netstat 沒有告訴您任何有用的信息,那麼您可以使用

kill -9 5719 

-9 開關發送 SIGKILL 而不是預設的 SIGTERM 訊號,如果進程是可停止的,這將停止進程。

SIGTERM 訊號被傳送到進程,並有效地要求其關閉。進程可以選擇捕獲 SIGTERM 並完全執行其他操作。

另一方面,SIGKILL 訊號不會被傳送到進程,因此不能被忽略。核心立即終止進程,因此只能作為最後的手段使用,因為它不為進程提供清理的機會。

如果進程被 I/O 阻止,則可能無法使用 SIGKILL 停止它,在這種情況下,它是殭屍進程,可能需要重新啟動才能清除它。

詳細說明:如果進程正在等待 I/O,則無法將其殺死,因為這樣做會為執行所述 I/O 的核心函數留下懸空回調。

或者,如果進程的父進程不調用wait,則該進程將保持殭屍進程狀態。死進程的一個很好的總結位於http://www.linuxsa.org.au/tips/zombies.html

ps 中出現的這些殭屍行程是什麼?我殺了他們,但他們並沒有消失!

殭屍是死工。你不能殺死死人。所有進程最終都會死亡,當它們死亡時,它們就會變成殭屍。它們幾乎不消耗任何資源,這是可以預料的,因為它們已經死了!殭屍的原因是殭屍的父行程(行程)可以檢索殭屍的退出狀態和資源使用統計資料。父進程透過使用 wait() 系統呼叫之一向作業系統發出它不再需要殭屍進程的訊號。

當一個行程死亡時,它的子行程全部成為 1 號行程(即 init 行程)的子行程。 Init「總是」等待孩子們死亡,這樣他們就不會繼續成為殭屍。

如果您有殭屍進程,則表示這些殭屍進程尚未被其父進程等待(查看 ps -l 顯示的 PPID)。你有三個選擇: 修復父進程(讓它等待);殺死父母;或忍受它。請記住,忍受它並不那麼困難,因為殭屍在 ps 的輸出中只佔用多一行。

相關內容