linux删除文件退出,在Linux中用于在移动或删除文件时使`tail -f`退出的bash脚本
目前刪除,移動或重命名在其上運行tail -f的文件什么都不做,我希望它能夠中止.我已經閱讀了手冊頁,似乎-f應該在文件移動時中止,-F將跟隨文件,但在Mac OS X上似乎-f和-F是相同的.如何編寫一個bash腳本,在文件移動后使tail -f完全退出?
>在
Linux上,你可以使用tail –follow = name(而不僅僅是-f,相當于–follow = descriptor)來實現你想要的,但是只有文件是DELETED而不是移動 – 一旦文件刪除,報告錯誤消息并退出尾部(代碼1);遺憾的是,相比之下,如果文件僅僅是MOVED(重命名),則tail不會退出 – 需要一個程序化的解決方案.
>在OSX上,您始終需要一個程序化解決方案 – 無論文件是移動還是刪除.
一旦目標文件不再存在(以其原始名稱)退出尾部的bash腳本 – 來自@ schellsan自己答案的更強大的腳本表達式:
#!/usr/bin/env bash
tail -f "$1" & # start tailing in the background
while [[ -f $1 ]]; do sleep 0.1; done # periodically check if target still exists
kill $! 2>/dev/null || : # kill tailing process, ignoring errors if already dead
>正確處理需要引用的文件名(例如,帶有嵌入空格的名稱).
>通過在文件存在檢查之間休眠來防止創建緊密循環 – 根據需要調整睡眠持續時間;警告:一些平臺只支持積分秒.
如果需要更強大的穩定性,這里有一個版本:
>通過退出陷阱殺死后臺進程,以確保它被殺死,無論腳本本身如何退出(通常,或者說,通過Control-C).
>如果發現后臺進程不再存在,則退出腳本.
#!/usr/bin/env bash
# Set an exit trap to ensure that the tailing process
# - to be created below - is terminated,
# no matter how this script exits.
trap '[[ -n $tailPid ]] && kill $tailPid 2>/dev/null' EXIT
# Start the tailing process in the background and
# record its PID.
tail -f "$1" & tailPid=$!
# Stay alive as long as the target file exists.
while [[ -f $1 ]]; do
# Sleep a little.
sleep 0.1
# Exit if the tailing process died unexpectedly.
kill -0 $tailPid 2>/dev/null || { tailPid=; exit; }
done
總結
以上是生活随笔為你收集整理的linux删除文件退出,在Linux中用于在移动或删除文件时使`tail -f`退出的bash脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux可以ping通,Linux可以
- 下一篇: linux性能测试命令h,Linux性能