Bash
刪除腳本中不需要的文件鎖定
我有一些使用flock 執行檔的腳本。它運作良好。問題是當這個腳本呼叫另一個腳本時,它會創建後台程序。在這種情況下後台程序繼承文件鎖定文件句柄,這是系統行為。我正在尋找任何可以用作包裝器並關閉所有不需要的句柄的工具,特別是用於文件鎖。
在我的想法中,應該只保護主程序不執行兩次。我知道這是不典型的情況。通常所有的孩子都應該完成離開文件鎖,但在這種情況下這不起作用。
現在我使用一些解決方法,使用一些帶有上面主要程式碼的包裝器,但我更喜歡使用一些二進制包裝器。
程式碼:
#!/bin/bash for fd in $(ls /proc/$$/fd); do case "$fd" in 0|1|2|255) ;; *) eval "exec $fd>&-" ;; esac done exec $1 $2 $3 $4 $5 $6 $7 $8 $9
您的腳本似乎足夠好。只需要一些改進:
#!/bin/bash shopt -s nullglob for fd in "/proc/$$/fd/"*; do fd=${fd##*/} case "$fd" in 0|1|2|255) ;; *) eval "exec $fd>&-" ;; esac done exec "$@"
nullglob
如果沒有找到文件,則防止模式出現。- 借助
${v##pat}
參數替換方法進行萬用字元或文件名擴展就足夠了。ls
不需要使用。- 您可以只使用
"$@"
來表示傳遞給腳本的所有參數。該腳本保證在沒有任何外部依賴的情況下執行,因此它與執行二進製文件一樣好。