summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile2
-rw-r--r--README.md9
-rw-r--r--dontneed.c32
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);
+}