2017-03-08 81 views
0

我要自動遠程proccess知道,如果我的機器運行超出了i節點的(發生的事情經常由於惡劣的配置...)。可悲的是,它運行在輕量級Linux上,在df命令中沒有-i選項,因此該選項不可行。我做了一些研究,並且遇到了一些找到inode和類似文件夾的方法,但我不想那樣做。inode使用情況而不DF -i

我需要一種方法(在C或bash)知道我的系統是如何的inode總共有目前aviable。

+0

至於'C'源代碼可能採取的'df.c'這是開源的一部分。 http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob_plain;f=src/df.c;hb=refs/heads/master 至於'bash'解決方案,請採取其他看看SO質疑 http://stackoverflow.com/questions/653096/how-to-free-inode-usage – Arseniy

+1

你能使用Perl http://search.cpan.org/~iguthrie/Filesys-Df -0.92/Df.pm還是Python? http://stackoverflow.com/questions/20727179/calculate-percentage-inode-usage-using-python – tripleee

+0

我有Perl,但沒有Python。我會看看這個解決方案。 TY。 – J63

回答

3

你追求的是什麼,是由statvfs()功能報告,對於每一個安裝的文件系統(通過提供對所述安裝的文件系統中的任何文件或目錄的路徑指定)。

如果系統安裝了GNU的coreutils,它具有體積小工具,叫做stat。對於文件系統上的文件或目錄的每條路徑,

stat -c '%d %c' -f /path 

報告可用inode的數量和inode的總數,每個路徑給出一行。如果系統使用busybox,則

busybox stat -c '%d %c' -f /path 

做同樣的事情。

如果您需要輸出更多的控制權,或者兩者都不適合你上面的工作由於某種原因,你可以很容易地編寫自己的實用報告摘要: 下面是一個例子,的inode,stats.c

#define _POSIX_C_SOURCE 200809L 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/statvfs.h> 
#include <stdint.h> 
#include <inttypes.h> 
#include <string.h> 
#include <errno.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    dev_t  device[argc]; 
    int   devices = 0; 
    uint64_t total_inodes = 0; 
    uint64_t avail_inodes = 0; /* Free to normal users */ 
    uint64_t free_inodes = 0; /* Free to superuser */ 
    int   arg, i; 

    if (argc < 2 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { 
     printf("\n"); 
     printf("Usage: %s [ -h | --help ]\n", argv[0]); 
     printf("  %s mountpoint [ mountpoint ... ]\n", argv[0]); 
     printf("\n"); 
     printf("This program will report the percentage of inodes in use,\n"); 
     printf("the number free inodes available for normal users,\n"); 
     printf("the number of free inodes available for root,\n"); 
     printf("and the total number of inodes,\n"); 
     printf("in the filesystems referred to the supplied paths.\n"); 
     printf("\n"); 
     printf("Each mount is only counted once, even if multiple paths\n"); 
     printf("to the same mount are given as parameters.\n"); 
     printf("\n"); 
     return EXIT_SUCCESS; 
    } 

    for (arg = 1; arg < argc; arg++) { 
     struct stat  info; 
     struct statvfs vfsinfo; 

     if (stat(argv[arg], &info) == -1) { 
      fprintf(stderr, "%s: %s.\n", argv[arg], strerror(errno)); 
      continue; 
     } 
     if (statvfs(argv[arg], &vfsinfo) == -1) { 
      fprintf(stderr, "%s: %s.\n", argv[arg], strerror(errno)); 
      continue; 
     } 

     /* Check if device already seen. */ 
     for (i = 0; i < devices; i++) 
      if (info.st_dev == device[i]) 
       break; 
     if (i < devices) 
      continue; 

     /* Add to known devices. */ 
     device[devices++] = info.st_dev; 

     /* Add to inode counters. */ 
     total_inodes += (uint64_t)vfsinfo.f_files; 
     avail_inodes += (uint64_t)vfsinfo.f_favail; 
     free_inodes += (uint64_t)vfsinfo.f_ffree; 
    } 

    if (total_inodes < 0) { 
     fprintf(stderr, "No inodes!\n"); 
     return EXIT_FAILURE; 
    } 

    /* Print result. */ 
    printf("%.3f%% - %" PRIu64 " free (%" PRIu64 " for root) out of %" PRIu64 " inodes.\n", 
      100.0 - 100.0 * (double)avail_inodes/(double)total_inodes, 
      avail_inodes, free_inodes, total_inodes); 
    return EXIT_SUCCESS; 
} 

使用eg編譯它

gcc -Wall -O2 inode-stats.c -o inode-stats 

任選地使用例如安裝它

sudo install -o root -g root -m 0755 inode-stats /usr/bin 

並運行它,提供一個路徑,在支架(安裝的文件系統),你有興趣的任何目錄或文件。例如,

inode-stats//usr /var /home 

程序是足夠聰明,只算坐騎曾經,即使你提供了多個路徑來訪問目錄/文件 - 不像GNU coreutils或busybox stat

你可以平凡改變輸出報告的格式,並輕鬆添加其他的統計數據(如可用磁盤空間,使用(uint64_t)vfsinfo.f_bavail * (uint64_t)vfsinfo.f_bsize可用普通用戶的磁盤空間量,並(uint64_t)vfsinfo.f_blocks * (uint64_t)vfsinfo.f_frsize爲每個文件系統的總大小)。

+0

stat或busybox stat都不適合我。我會嘗試一下C解決方案並在稍後報告。 – J63

+0

@ J63:請做;現在我只能在x86-64系統上測試它。您還應該能夠以正常方式將其交叉編譯到目標系統。 –

+0

我將它編譯到我的目標系統,它工作正常。非常感謝你=) – J63