6

ディスクからデータを読み取っていること、およびデータがキャッシュされているだけではないことを確認する必要があるシステムでパフォーマンス テストを実行しています (たとえば、以前のテストから)。コマンドでキャッシュを削除できることをここで読みました

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

ただし、私のアカウントは管理者アカウント (login peter) ですが、パスワードが必要なことに注意してください。パスワードを入力する必要なしにバッチスクリプトでこれを実行できるようにしたい(これは明らかに手動であるため)

さらに調査した結果、sudoers ファイルにたどり着きました。私の計画では、上記のコマンドを dropCache という 1 行のスクリプトに入れ、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 に答える