允许非root用户删除缓存

时间:2012-11-30 14:15:55

标签: linux sudoers clear-cache

我正在一个系统上进行性能测试,我需要确保从磁盘读取数据,并且它不仅仅是缓存(比如早期的测试)。我读了here我可以使用命令

删除缓存
echo 3 | sudo tee /proc/sys/vm/drop_caches

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

更多research让我进入了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

由于 彼得

1 个答案:

答案 0 :(得分:8)

我需要的时候做的是我编写了一个小程序,将编译文件的所有者更改为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;
}