【问题标题】:Perl "import os" Python equivelant?Perl “import os” Python 等价物?
【发布时间】:2012-03-15 22:30:48
【问题描述】:

我想直接从 perl 与 linux 交互,以执行一些调用,例如 statvfs。我很好奇是否有一种方法可以只使用核心 perl 包(没有额外的模块)。

特别是,我想获取未安装/启用 df 的服务器的磁盘使用信息。

【问题讨论】:

    标签: linux perl


    【解决方案1】:

    use POSIX; 浮现在脑海中。然而,statvfs 不在它提供的功能之列。也许您正在这里寻找use Filesys::Df;

    我还没有看到安装了 perl,但没有安装 coreutils(df) 的系统...

    【讨论】:

    • +1 用于 Filesys::Df。 Parsing df output 非常容易出错。
    • 阅读问题:你不能使用Filesys::Df,因为它不是核心perl的一部分。
    【解决方案2】:

    我想直接从 perl 与 linux 交互,以执行一些调用,例如 statvfs。我很好奇是否有办法只使用核心 perl 包(没有额外的模块)来做到这一点。

    对您的问题的技术性但可能不是很有用的回答是,是的,确实存在一种方法来执行 statvfs 仅使用核心 perl 而没有模块的方式。它的工作原理是这样的:

    my $statfs_buffer = "\0" x length(pack($STATFS_TEMPLATE, ()));
    my $retval = syscall($SYS_statfs, $some_filename, $statfs_buffer);
    if ($retval == -1) {
        die "statfs failed: $!";
    }
    my($f_type,   $f_bsize, $f_blocks, $f_bfree,
       $f_bavail, $f_files, $f_ffree,
       $f_fsid,   $f_namelen) = unpack($STATFS_TEMPLATE, $statfs_buffer);
    

    问题是您必须自己找出$SYS_statfs$STATFS_TEMPLATE 的值;前者容易,后者不难。

    但是,在某些系统上,您必须使用这些系统的 statfs64 变体。

    所以是的,只要你有足够的决心,可能做你想做的事。不过,还有更好的方法。

    【讨论】:

    • 需要 'sys/syscall.ph' 来获取 SYS_statfs
    • @tchrist 我将如何确定其中任何一个变量的值?它会改变系统到系统吗?还是与操作系统/架构(或类似的东西)有关?
    • @GoldenNewby 最简单的方法是编写一个小 C 程序。是的,它在系统之间变化。 BSD statfs 结构看起来与 Linux 不同,系统调用号也不同。
    猜你喜欢
    • 2021-02-17
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2019-06-03
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多