2011-11-30 65 views
3

我在linux上使用Python 2.6。在Python中調用os.unlink(__ file__)是否安全?

我有一個run.py腳本,它在後臺啓動多個服務,並生成kill.py來殺死這些進程。

在kill.py中,當它完成它的工作時是否可以安全地解除鏈接?

import os 
# kill services 
os.unlink(__file__) 
# is it safe to do something here? 

我是新來的Python。我擔心的是,由於Python是一種腳本語言,整個腳本可能不在內存中。解除鏈接後,將不再有解碼代碼。

我試過這個小測試。

import os 
import time 
time.sleep(10)  # sleep 1 
os.unlink(__file__) 
time.sleep(10)  # sleep 2 

我跑stat kill.py時,該文件是正在運行和鏈路的數量總是1,所以我想Python解釋不成立的鏈接文件。

作爲一個更高層次的問題,創建一個進程列表的常用方法將在稍後被輕易殺掉?

+6

如果您在Linux上刪除了一個文件,只要至少有一個打開文件句柄,該文件仍然存在。它不再在目錄中,但是'lsof'仍然顯示它已被刪除。該機制用於臨時文件。 – hochl

回答

2

如果您可以避免它,請勿讓您的腳本編寫新腳本 - 只需寫出一份PID列表,然後通過它們。 你試圖做什麼並不是很清楚,但是創建和刪除腳本聽起來像是太脆弱的魔法。

回答這個問題: Python編譯所有的源代碼並在執行之前關閉文件,所以這是安全的。

一般來說,在Linux上解除鏈接已打開的文件是安全的。 (但不是無處不在:在Windows上無法刪除的文件正在使用中。)

注意,當你import一個模塊,Python的2編譯成一個.pyc字節碼文件,並解釋這一點。如果你刪除.py文件,Python仍然會使用.pyc,反之亦然。

0

Python在讀取整個源文件並在執行之前對其進行編譯,因此您不必擔心刪除或更改正在運行的腳本文件。

1

只是不要撥打reload

因爲它們在導入時被編譯和加載,所以不需要Python來鎖定這些文件。事實上,在程序運行時交換文件的能力通常非常有用。

1

IIRC(!):如果在* nix上unlink僅刪除文件系統中的名稱,則在關閉最後一個文件句柄時將刪除inode。因此這應該不會引起任何問題,除了python試圖重新打開文件。

+0

已經有人在你的帖子前10分鐘發表評論... – mac

+0

直到發帖後我纔看到。但我不想刪除我的答案。 – sleeplessnerd

1

作爲一個更高層次的問題,創建一個進程清單的常用方法是什麼?

我會把PID放在list中,然後用os.kill來重複。我不明白你爲什麼要爲此創建和執行新的腳本。

相關問題