Linux中國

使用 mlocate 查找文件

對於一個系統管理員來說,草中尋針一樣的查找文件的事情並不少見。在一台擁擠的機器上,文件系統中可能存在數十萬個文件。當你需要確定一個特定的配置文件是最新的,但是你不記得它在哪裡時怎麼辦?

如果你使用過一些類 Unix 機器,那麼你肯定用過 find 命令。毫無疑問,它是非常複雜和功能強大的。以下是一個只搜索目錄中的符號鏈接,而忽略文件的例子:

# find . -lname "*"

你可以用 find 命令做幾乎無盡的事情,這是不容否認的。find 命令好用的時候是很好且簡潔的,但是它也可以很複雜。這不一定是因為 find 命令本身的原因,而是它與 xargs 結合,你可以傳遞各種選項來調整你的輸出,並刪除你找到的那些文件。

位置、位置,讓人沮喪

然而,通常情況下簡單是最好的選擇,特別是當一個脾氣暴躁的老闆搭著你的肩膀,閑聊著時間的重要性時。你還在模糊地猜測這個你從來沒有見過的文件的路徑,而你的老闆卻肯定它在擁擠的 /var 分區的某處。

進一步看下 mlocate。你也許注意過它的一個近親:slocate,它安全地(注意前綴字母 s 代表安全)記錄了相關的文件許可權,以防止非特權用戶看到特權文件。此外,還有它們所起源的一個更老的,原始 locate 命令。

mlocate 與其家族的其他成員(至少包括 slocate)的不同之處在於,在掃描文件系統時,mlocate 不需要持續重新掃描所有的文件系統。相反,它將其發現的文件(注意前面的 m 代表合併)與現有的文件列表合併在一起,使其可以藉助系統緩存從而性能更高、更輕量級。

在本系列文章中,我們將更仔細地了解 mlocate (由於其流行,所以也簡稱其為 locate),並研究如何快速輕鬆地將其調整到你心中所想的方式。

小巧和 緊湊

除非你經常重複使用複雜的命令,否則就會像我一樣,最終會忘記它們而需要在用的時候尋找它們。locate 命令的優點是可以快速查詢整個文件系統,而不用擔心你處於頂層目錄、根目錄和所在路徑,只需要簡單地使用 locate 命令。

以前你可能已經發現 find 命令非常不聽話,讓你經常抓耳撓腮。你知道,丟失了一個分號或一個沒有正確轉義的特殊的字元就會這樣。現在讓我們離開這個複雜的 find 命令,放鬆一下,看一下這個聰明的小命令。

你可能需要首先通過運行以下命令來檢查它是否在你的系統上:

對於 Red Hat 家族:

# yum install mlocate

對於 Debian 家族:

# apt-get install mlocate

發行版之間不應該有任何區別,但版本之間幾乎肯定有細微差別。小心。

接下來,我們將介紹 locate 命令的一個關鍵組件,名為 updatedb。正如你可能猜到的那樣,這是更新 locate 命令的資料庫的命令。這名字非常符合直覺。

這個資料庫是我之前提到的 locate 命令的文件列表。該列表被保存在一個相對簡單而高效的資料庫中。updatedb 通過 cron 任務定期運行,通常在一天中的安靜時間運行。在下面的清單 1 中,我們可以看到文件 /etc/cron.daily/mlocate.cron 的內部(該文件的路徑及其內容可能因發行版不同)。

#!/bin/sh

nodevs=$(< /proc/filesystems awk &apos;$1 == "nodev" { print $2 }&apos;)

renice +19 -p $$ >/dev/null 2>&1

ionice -c2 -n7 -p $$ >/dev/null 2>&1

/usr/bin/updatedb -f "$nodevs"

清單 1: 每天如何觸發 「updatedb」 命令。

如你所見,mlocate.cron 腳本使用了優秀的 nice 命令來儘可能少地影響系統性能。我還沒有明確指出這個命令每天都在設定的時間運行(但如果我沒有記錯的話,原始的 locate 命令與你在午夜時的計算機減速有關)。這是因為,在一些 「cron」 版本上,延遲現在被引入到隔夜開始時間。

這可能是因為所謂的 「 河馬之驚群 Thundering Herd of Hippos 」問題。想像許多計算機(或飢餓的動物)同時醒來從單一或有限的來源要求資源(或食物)。當所有的「河馬」都使用 NTP 設置它們的手錶時,這可能會發生(好吧,這個寓言扯多了,但請忍受一下)。想像一下,正好每五分鐘(就像一個 「cron 任務」),它們都要求獲得食物或其他東西。

如果你不相信我,請看下配置文件 - 清單 2 中名為 anacron 的 cron 版本,這是文件 /etc/anacrontab 的內容。

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

# the maximal random delay added to the base delay of the jobs

RANDOM_DELAY=45

# the jobs will be started during the following hours only

START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command

1       5       cron.daily              nice run-parts /etc/cron.daily

7       25      cron.weekly             nice run-parts /etc/cron.weekly

@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly 

清單 2: 運行 「cron」 任務時延遲是怎樣被帶入的。

從清單 2 可以看到 RANDOM_DELAY 和 「delay in minutes」 列。如果你不熟悉 cron 這個方面,那麼你可以在這找到更多的東西:

# man anacrontab

否則,如果你願意,你可以自己延遲一下。有個很棒的網頁(現在已有十多年的歷史)以非常合理的方式討論了這個問題。本網站討論如何使用 sleep 來引入一個隨機性,如清單 3 所示。

#!/bin/sh

# Grab a random value between 0-240.
value=$RANDOM
while [ $value -gt 240 ] ; do
 value=$RANDOM
done

# Sleep for that time.
sleep $value

# Syncronize.
/usr/bin/rsync -aqzC --delete --delete-after masterhost::master /some/dir/

清單 3:在觸發事件之前引入隨機延遲的 shell 腳本,以避免河馬之驚群

在提到這些(可能令人驚訝的)延遲時,是指 /etc/crontab 或 root 用戶自己的 crontab 文件。如果你想改變 locate 命令運行的時間,特別是由於磁碟訪問速度減慢時,那麼它不是太棘手。實現它可能會有更優雅的方式,但是你也可以把文件 /etc/cron.daily/mlocate.cron 移到別的地方(我使用 /usr/local/etc 目錄),使用 root 用戶添加一條記錄到 root 用戶的 crontab,粘貼以下內容:

# crontab -e

33 3 * * * /usr/local/etc/mlocate.cron

使用 anacron,而不是通過 /var/log/cron 以及它的舊的、輪轉的版本,你可以快速地告訴它上次 cron.daily 任務被觸發的時間:

# ls -hal /var/spool/anacron

下一次,我們會看更多的使用 locateupdatedb 和其他工具來查找文件的方法。

via: https://www.linux.com/blog/learn/intro-to-linux/2017/11/finding-files-mlocate

作者:CHRIS BINNIE 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國