無論如何要失敗/延遲 cp 過程?

無論如何要失敗/延遲 cp 過程?

這是一個假設場景。假設我有一個特定的資料夾,該資料夾正在由透過網路接收檔案/資料夾的進程同步。現在,當此操作正在進行時,為了同步器的緣故,不應對其目錄進行 cp 操作。無論如何,這可以實現嗎?

答案1

至少有兩種可能的解決方案:

  1. 為 cp 建立一個包裝器腳本,透過檢查進程是否正在運行或測試鎖定檔案來檢查同步是否正在執行,然後中止或延遲操作。
  2. 用於LD_PRELOAD掛斷電話write和其他通話。

第一個解決方案的問題是,您必須將用於寫入資料夾的所有命令包裝起來,例如,,,,,,mv…另一方面,它非常簡單,但也僅適用於您當前的用戶。cprsyncrmlncat

對於第二個解決方案,您必須編寫一個共享庫,其中包含用於更改/修改目錄的所有系統調用,例如write, unlink, rename。但該解決方案適用於所有動態連結的可執行檔 - 因此無需調整其他所有程式。

答案2

如果您知道同步進程正在運行並且知道唯一可能的操作是cp,那麼您可以SIGSTOP向所有進程發送訊息以暫停執行。同步完成後,您發送SIGCONT到所有進程以繼續。

為此,您可以使用kill -s SIGSTOP $(pidof cp)killall -s SIGSTOP cp。在終端機中,您可以使用Ctrl+Z將任務置於背景(「暫停」)。若要繼續執行,請使用fg命令(“前台”,請參閱help fg)。

答案3

您的同步器正在寫入目錄而不是讀取,對吧?因此,拍攝檔案系統快照或設定不可變位元已經過時了。

如果您以 root 身分執行同步器,則可以將目錄的擁有權變更為 root,並將權限變更為 700(rwx-----;只有擁有者可以執行任何操作)。這將阻止任何不以 root 身分運行的新進程,但任何已開啟檔案或子目錄的進程仍然能夠進行更改。

在 Linux 上,如果您想查找樹中目前開啟檔案的所有進程,您可以執行lsof +D my_directory.然而,你用這些知識做什麼取決於具體情況。

相關內容