2012-11-30 50 views
5

我在系統上執行性能測試,我需要確保從磁盤讀取數據,而且不僅僅是緩存(比如早期的測試)。我讀here,我可以用命令刪除緩存允許非root用戶放棄緩存

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

感謝 彼得

回答

7

什麼,當我需要的,這是我寫了一個小的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; 
} 
+0

喜托馬斯 - 冷靜 - 讓我試試看,並送還給你! –

+1

這工作!謝謝托馬斯 - 你應該得到你的高信譽評分 –

+0

這個可執行文件存在安全風險 - 你不需要設置你的PATH並且運行一個沒有絕對路徑名的外部命令。您可以直接調用sync()系統調用,而不是運行外部同步命令。 –