2010-07-06 15 views
0

我已經寫了一個python腳本,它做了一些curses和pysqlite的東西,但我注意到在我通過ssh運行這個腳本的場合該ssh會話因爲python腳本實際不會退出的原因而被終止,而是最終成爲init的子節點,並且永遠停留在那裏。我不能殺死他們或任何東西。他們還將報告的系統負載增加了1.目前,我有8個這樣的大多數死機進程在停滯,服務器的平均負載爲8.比特。我認爲這是因爲有些資源是這些腳本正在等待的,但是lsof沒有顯示任何實際打開的資源,它們使用的所有數據文件都被列爲刪除等等......並且它們不使用cpu時間。父母殼後掛的Python腳本(curses + pysqlite)消失

我在腳本中做了一些信號檢查,呼籲在HUP上做一些刷新例程,但沒有別的,沒有分叉或任何東西,我不知道爲什麼腳本不只是洗牌關閉我的ssh會話時關閉。

感謝克里斯

+0

詳細說明'不能殺死他們或任何東西'。你的意思是你可以成功發出'kill -9'命令,但是這個過程仍然存在?! – MattH 2010-07-06 09:26:21

+0

是的,他們沒有迴應任何我知道擺脫過程的方法。他們也不是殭屍。 – 2010-07-06 10:10:51

回答

1

好,他們不關閉,當你的SSH會話終止的原因是因爲HUP是使用由父母告知其子女,他們應該關閉信號。如果您重寫此信號的行爲,那麼在SSH會話關閉時,您的進程不會自動關閉。至於爲什麼你不能殺死他們,但是,我不知所措。我見過的唯一導致這種行爲的行爲是在行爲異常的文件系統上被阻止(nfs & unionfs是我遇到過的兩個問題)。

+0

它正在讀NFS上的一個sqlite數據庫,所以這應該是一個角度... 它真的發送一個hup來關閉它嗎?沒有不同的信號?爲了重新加載工具中的配置,我攔截了hup,就像篡改守護進程一樣。顯然他們分叉得很好,但我只是試圖讓它關閉它的數據庫連接幾分鐘,所以sqlite數據庫可以與其他腳本混淆...我想我可以選擇一個不同的信號? – 2010-07-07 08:21:45

+0

是的,HUP是「掛斷」的簡稱,可以追溯到用戶「掛斷」(關閉終端)時用於關閉後臺進程的舊串行線路。現代守護進程完全按照你的建議使用它,但這是因爲它們不打算通過終端和shell進行控制。對於調試,我建議SIGUSR1然後可能會切換回來,當你生產。欲瞭解更多信息:http://en.wikipedia.org/wiki/SIGHUP – Rakis 2010-07-07 12:46:04