6

我正在一个系统上进行性能测试,我需要确保我正在从磁盘读取数据,并且它不只是缓存(比如来自早期测试)。我在这里读到我可以使用命令删除缓存

echo 3 | sudo tee /proc/sys/vm/drop_caches

但是,请注意,即使我的帐户是管理员帐户(登录 peter),它仍然需要我的密码。我希望能够在不需要输入密码的情况下在批处理脚本中运行它(因为这显然是手动的)

更多的研究使我找到了 sudoers 文件。我的计划是将上述命令放入一个名为 dropCache 的单行脚本中,然后编辑 sudoers,这样我就可以在不输入密码的情况下运行它。所以我添加了这一行

ALL ALL=(ALL)NOPASSWD:/home/peter/dropCache

在我的 sudoers 文件的末尾(使用 visudo)。使用我的管理员帐户,如果我运行

sudo -l 

我明白了

(ALL) NOPASSWD: /home/peter/dropCache

但是,如果我运行我的 dropCache 脚本,我仍然会被要求输入密码

./dropCache
[sudo] password for peter: 

对此的任何帮助将不胜感激。我正在运行 Ubuntu 12.04

谢谢彼得

4

2 回答 2

10

当我需要这个时,我做了一个小 C 程序,将编译文件的所有者更改为 root,并设置 setuid 位。

这是源代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

extern void sync(void);

int main(void) {
    if (geteuid() != 0) {
        fprintf(stderr, "flush-cache: Not root\n");
        exit(EXIT_FAILURE);
    }
    printf("Flushing page cache, dentries and inodes...\n");
    // First: the traditional three sync calls. Perhaps not needed?
    // For security reasons, system("sync") is not a good idea.
    sync();
    sync();
    sync();
    FILE* f;
    f = fopen("/proc/sys/vm/drop_caches", "w");
    if (f == NULL) {
        fprintf(stderr, "flush-cache: Couldn't open /proc/sys/vm/drop_caches\n");
        exit(EXIT_FAILURE);
    }
    if (fprintf(f, "3\n") != 2) {
        fprintf(stderr, "flush-cache: Couldn't write 3 to /proc/sys/vm/drop_caches\n");
        exit(EXIT_FAILURE);
    }
    fclose(f);
    printf("Done flushing.\n");

    return 0;
}
于 2012-11-30T14:23:00.580 回答
0

我在 Ubuntu 21.04 上试过这个并且它有效: 第 1 步:创建一个如下所示的小脚本(假设名称为 clear_drop_cacahes.sh):

#!/bin/sh

# Run a sync to reduce dirty caches
sync

# Tell the OS to clear caches
echo 3 > /proc/sys/vm/drop_caches

第 2 步:使脚本可执行:chmod 744 clear_drop_caches.sh

第 3 步:需要与具有 sudo 权限的人一起执行此操作:

sudo visudo

添加以下行(到文件末尾)

ALL      ALL=(ALL) NOPASSWD:/path-to-the-small-script/clear_drop_caches.sh

第 4 步:现在任何用户都可以运行 drop caches 脚本,如下所示:

sudo /path-to-the-small-script/clear_drop_caches.sh

我不确定做这样的事情的安全性。

于 2021-12-14T18:41:11.867 回答