diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | README.md | 9 | ||||
-rw-r--r-- | dontneed.c | 32 |
4 files changed, 44 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd1c827 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/dontneed diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9cfc02c --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +dontneed: dontneed.c + gcc -Wall dontneed.c -o dontneed diff --git a/README.md b/README.md new file mode 100644 index 0000000..c164345 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# dontneed: tell linux you don't need some files in RAM cache + +Maybe used to prevent swapping about files you write but don't read, like somedump.sql.gz on somelog.1.gz. + + Usage: ./dontneed <path>... + Calls posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED) on each <path> + + Tip: you may find all cached files from rootfs with the costly one-liner: + # find / -mount -type f -print0 | xargs -r0 fincore | grep -vE '^ *0B' | sort -hr | uniq | less diff --git a/dontneed.c b/dontneed.c new file mode 100644 index 0000000..29b25d8 --- /dev/null +++ b/dontneed.c @@ -0,0 +1,32 @@ +#include <fcntl.h> // posix_fadvise +#include <errno.h> // errno +#include <string.h> // strerror +#include <stdio.h> // fprintf +#include <unistd.h> // open,close + +int usage(char progname[]) { + fprintf(stderr, "Usage: %s <path>...\n", progname); + fprintf(stderr, " Calls posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED) on each <path>\n\n"); + fprintf(stderr, " Tip: you may find all cached files from rootfs with the costly one-liner:\n"); + fprintf(stderr, " # find / -mount -type f -print0 | xargs -r0 fincore | grep -vE '^ *0B' | sort -hr | uniq | less\n"); + return 1; +} + +int main(int argc, char** argv) { + int i, fd, advise_errno, errors=0; + if ( argc < 2 ) return usage(argv[0]); + for (i=1; i<argc; i++) { + fd = open(argv[i], O_RDONLY); + if ( fd == -1 ) { + fprintf(stderr, "Can't open '%s': %s\n", argv[i], strerror(errno)); + errors++; continue; + } + advise_errno = posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + if ( advise_errno != 0 ) { + fprintf(stderr, "Can't posix_fadvise '%s' (%i): %s\n", argv[i], advise_errno, strerror(errno)); + errors++; //don't forget to close(fd) anyway + } + close(fd); + } + return (errors != 0); +} |