我可以禁用updatedb吗?


26

updatedb必要吗?我从没使用过locate,我的服务器往往有数以千万计的文件,这些文件通常会使updateb长时间运行,并消耗MySQL和/或其他软件所需的I / O。

我可以将其从cron中删除,然后期望一切正常吗?(我指的是在服务器上找到的常用软件:Linux,cpanel,mysql,apache,php等)。

Answers:


25

是的,您可以在权杖中禁用它或删除提供的软件包updatedb。在Red Hat系统上,您需要执行确定是否需要删除任何内容的步骤。

  1. 首先找出程序在磁盘上的位置。

    $ type updatedb
    updatedb is /usr/bin/updatedb
    
  2. 接下来找出软件包提供的内容updatedb

    $ rpm -qf /usr/bin/updatedb
    mlocate-0.26-3.fc19.x86_64
    
  3. 看看是否有任何要求mlocate

    $ rpm -q --whatrequires mlocate
    no package requires mlocate
    
  4. 不需要它,因此您可以删除包装。

    $ yum remove mlocate
    

1
rpm也有--whatrecommends。我认为Fedora在过去的几年中开始将其视为一种概念。(在debian / ubuntu以后很长一段时间就默认安装“推荐”依赖项以及“需要”依赖项)。
sourcejedi

所以删除后可以删除/var/lib/mlocate吗?
Ramratan Gupta,

1
@RamratanGupta -是
SLM

13

您可以/var/www通过编辑/etc/updatedb.conf配置文件来禁用对包含多个文件的目录的扫描。如果您确实要禁用它,则只需删除cronjob。


5

您会知道,如果另一个程序包使用它,请使用程序包管理器将其删除,因为它必须依赖它(程序包依赖性)。

我有一台服务器Nginxphp-fpmmysql和它精美的作品没有updatedb


此外,在容易就可以使用aptitude removeaptitude whyaptitude search '?installed ?recommends(mlocate)'。这些都将显示推荐的依赖关系,以及要求的依赖关系。apt现在默认情况下会安装推荐的软件包,因此尽管它们并不是必不可少的,但是可以依靠它们提供一些非常有用的子功能。
sourcejedi

0

我不会这么说,但很可能不是updateb导致了您的问题。可能是您不想要的其他东西,或者是尚未配置为“喜欢”的备份应用程序,或者是配置文件/系统组结构存在一些安全问题。

似乎系统内存分配对用户不利的另一种情况是一个“不知道堆叠虚拟文件系统”的情况。那就是问题的鼻涕。可以说是“虚拟的逻辑不良炸弹”。

在ext 4系统上以fat32格式格式化的USB驱动器经常会发生这种情况,然后将其转移到zfs系统,该系统未将csh shell设置为man登录shell。它在磁盘上创建“只读USB文件系统”问题的虚拟递归,并将驱动器从fat32格式化/挂载到vFat,这反过来又会创建坏块扇区,并将目录提取(虚拟移动)到其上父目录级别,这会导致无限循环!该目录实际上不在父级的层次结构上。原因是csh的语法。*注意:该驱动器在除zfs c-shell登录系统以外的所有系统上都是只读的。

要完全禁用updatedb,可能会在内存分配和“回滚效果”方面产生不良逻辑。.如果您曾经不希望回滚,那么您知道我的意思是当两个小时的命令行脚本是Fubar编写的,因为您没有将作业处理分配到内存中。

现在,如果您有两个或多个物理处理器(例如,双核或更多)和ddr3 ram,则可以。只要您没有运行繁重的图形(在这种情况下,如果该功率负载导致了您的问题),则updateb将排在您的列表中。如果您出于某种原因试图掩盖系统的运行,那么还有其他方法可以解决此问题,而不是禁用updateb,实际上,updated会巩固您的行为,以至于在系统掩盖下“什么也没有发生”。

坦率地说,基于二进制文件/ usr / bin / updatedb的大小,并考虑与OS中的信号/系统通信的体系结构,并且Bash的大小是相互链接的Shell dash或ash的10倍,异步调用是在系统上非常便宜。

如果您登录时运行了编写的顺序脚本,并且您是管理员(例如sudo),则运行以下命令:

~$ sudo bash
:~# ./script.sh

然后,您可能想在脚本中创建一个局部变量(updatedb需要系统特权,AKA根/ sudo / wheel),例如:

#! /bin/sh
# Create local variables
UPD="updatedb"

echo "Beginning Execution of sequence "

在这种情况下,序列将使用您编写的其他shell脚本中的STDOUT / STDIN并在主脚本中将其作为变量执行,或者说您设置了个人或企业管理软件包,可在此从cdrom上载/下载/端口usb或任何非常大的文件,并且具有适合他们的个人安装脚本,您想保留updatedb。打开终端外壳后,这就是您的主要应用程序实例。其他应用程序可以/确实可以异步运行,但是就整体系统/计算需求而言,updatedb是最便宜的应用程序之一。很多次,尤其是在lxdm Desk Enviro和Lxterm上(那东西非常快),但不是唯一的;没有在脚本中添加updatedb,该系统向我显示了文件不存在或发生错误的错误。我喜欢什么!

外壳比它管理的系统快,我向您保证!

在这种情况下,您将调用updateb变量将先前的序列锁定到内存中,如下所示

echo "Updating local database "

$UPD

echo "Exiting script two "

exit

你看到我在说什么吗?如果您问这个问题是因为您正在运行执行速度测试,例如Andrew Tanenbaum风格而不是它。其他明智的使用该工具的好处。


updateb的问题不是CPU或内存,而是IO带宽。以我为例(一个拥有强大CPU和大量可用内存的系统),它以5 MB / s的速度逐小时旋转我的硬盘,持续数小时,这减慢了依赖该驱动器的所有其他速度。而且,当我确切知道要查找的内容时,它们是新文件,因此locate没有用,因为我无法确定它是否已建立索引。文件较旧时,我进行fzf模糊搜索。
Davidmh

0

至少在ArchLinux中,似乎默认启用了,man-db.timer并且updatedb.timer默认情况下已启用(即:存在以下文件),但是存在no installation config (WantedBy, RequiredBy, Also, Alias settings in the [Install] section, and DefaultInstance for template units). This means they are not meant to be enabled using systemctl. [...](来自的输出systemctl enable {man-,update}db.timer)。

这些是文件系统中存在的符号链接:
/usr/lib/systemd/system/multi-user.target.wants/man-db.timer
/usr/lib/systemd/system/multi-user.target.wants/updatedb.timer

只需删除它们就可以了。
不过,他们会在每个RE /安装重新创建/升级的man-dbmlocate分别包。

对于ArchLinux,可能的解决方法是为pacman删除它们提供一个钩子。
但是,即使您希望在升级过程中启用它们,也会在每次此类事件时将其删除。
在这种情况下,可以在希望启用计时器时禁用该挂钩。
但是,启用计时器仅在软件包的重新/安装/升级时才有效,因为默认.timer单位文件中没有可直接systemctl enable配置计时器的部分。
需要使用手册ln -s ../man-db.timer /usr/lib/systemd/system/multi-user.target.wants/man-db.timerln -s ../updatedb.timer /usr/lib/systemd/system/multi-user.target.wants/updatedb.timer命令来启用计时器,并删除链接以禁用计时器。

您可能已经覆盖了自定义单位/etc/systemd/system/{man-,update}db.timerWantedBy=multi-user.target[Install]允许的部分中提供systemtl enable|disable,但是链接/usr/lib/systemd/system/multi-user.target.wants/{man-,update}db.timer仍会在re / installation / upgrade上创建,从而有效地重新启用.timers。

您也可以运行systemctl mask man-db.timer updatedb.timer以掩盖计时器。
即使仍然有可能手动运行systemctl start man-db.service updatedb.service以启动相应的服务,但由于用户发现自己想要/需要这样做的原因,您也将无法手动启动计时器。如果需要/需要,
此解决方法不允许覆盖自定义/etc/systemd/system/{man-,update}db.timer单元文件,因为systemd需要用符号链接替换它们/dev/null以表示被屏蔽的单元。

遮罩似乎是侵入性最小的解决方案。
我更喜欢/usr/lib/systemd/system/multi-user.target.wants/{man-,update}db.timer在每次升级后手动删除,并覆盖/etc/systemd/system/{man-,update}db.timer具有[Install]一部分的单元文件WantedBy=multi-user.target以启用手动systemctl启用/禁用。

不幸的是,目前还没有简单的解决方法,至少我可以想到。
这假定包man-dbmlocate都希望/需要保存在系统中安装:移除它们不会是一个期望的/有用的解决方案。

另请参阅: https://www.reddit.com/r/archlinux/comments/36fqzh/updatedbservice_and_mandbservice_increases_boot/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.