While the answer:
sudo updatedb
is technically correct, it is almost never a good idea to run updatedb
on a command line by itself, if there is also a cron job installed. Depending on the Unix flavor the cronjob contains locking provisions and any amount of configuration which is not covered by the standalone updatedb
command.
If the locate database needs to be updated frequently, it is definitely worth the effort to determine the proper cron job for a specific host and run it manually.
Depending on the administrator, the cronjob for updatedb
may be hidden in various locations. So a simple brute-force attempt to find the cron job would be:
( sudo crontab -l > /tmp/crontab.root;
( echo /tmp/crontab.root; ls -1d /etc/*cron* /etc/*cron*/* ) \
| tr '\n' '\0' \
| xargs -0 -r -e grep -nH -e updatedb;
rm -f /tmp/crontab.root
) 2>/dev/null
which shows the following result on one of my Ubuntu systems:
/etc/cron.daily/mlocate:5:[ -x /usr/bin/updatedb.mlocate ] || exit 0
/etc/cron.daily/mlocate:21:flock --nonblock /run/mlocate.daily.lock $IONICE /usr/bin/updatedb.mlocate
The correct command to update the locate database in this case is therefore
sudo /etc/cron.daily/mlocate
A more systematic approach is to determine the package which provides locate
and updatedb
.
E.g., on an OS with apt/dpkg packaging you can find which flavor of locate is installed with:
dpkg -S locate | grep /bin/
In my case it is:
mlocate: /usr/bin/updatedb.mlocate
To see, which cron job if any is responsible, run:
dpkg -L mlocate | grep cron
Which in my case shows:
/etc/cron.daily
/etc/cron.daily/mlocate
To update the database, run the cron job as root:
sudo /etc/cron.daily/mlocate
If there is no cronjob, and updatedb by itself does not work, try finding your installed flavor with:
dpkg -L mlocate | grep /bin/
which returns:
/usr/bin/mlocate
/usr/bin/updatedb.mlocate
Update
There is yet another approach to run updatedb on a daily basis using a oneshot systemd service named updatedb.service, mlocate-updatedb.service, etc. This service is triggered by a corresponding timer updatedb.timer, mlocate-updatedb.timer. Here is a sample service file, I found in a repository:
[Service]
Type=oneshot
ExecStart=/usr/bin/updatedb
IOSchedulingClass=idle
Although it just calls ionice -c 3 /usr/bin/updatedb
in this case, it still is better to start the service, making sure it is run in the correct environment without the need to double and triple check the service file for changes introduced by the system maintainers during updates:
sudo systemctl start updatedb.service
Besides examining the package file list, checking for a service can be done with a command like:
systemctl list-unit-files | grep 'updatedb\|locate'
locate
is from the GNU Find Utilities project (which, if you are using Debian Jessie, it probably is), then you can find the project's website and documentation here: https://www.gnu.org/software/findutils/ – Apr 23 '18 at 17:48