在Perl中运行具有修改的调度优先级的OS功能

时间:2011-12-19 15:16:52

标签: linux perl

是否可以让Perl在没有外部命令的情况下运行具有修改的调度和/或IO调度优先级的Linux OS功能?我试图模拟以下内容:

nice -n19 ionice -c2 -n7 cp largefile largefile2

我能以某种方式使用File :: Copy,setpriority函数和CPAN模块Linux :: IO_Prio吗?我只需要降低$ 0的调度优先级吗?

编辑: 如果我执行以下操作,将降低copy()的优先级和IO吗?有更好的方法吗?

use Linux::IO_Prio qw(:all);
use File::Copy;

setpriority(0, 0, -20);
ionice(IOPRIO_WHO_PROCESS, $$, IOPRIO_CLASS_IDLE, 7);

copy("file1","file2") or die "Copy failed: $!";

2 个答案:

答案 0 :(得分:1)

您最好只需根据需要更改当前正在运行的pid的优先级。当然不是便携式的,但这样做本身就是不便携的。执行此类操作的任何事情都将归结为使相同的库调用外部命令。

my $pid = $$;
`ionice -c2 -p$pid`;
`renice +19 $pid`;

答案 1 :(得分:1)

精炼Oesor’s answer

use BSD::Resource qw(PRIO_PROCESS setpriority);
use Linux::IO_Prio qw(IOPRIO_WHO_PROCESS IOPRIO_PRIO_VALUE IOPRIO_CLASS_BE ioprio_set);
BEGIN { require autodie::hints; autodie::hints->set_hints_for(\&ioprio_set, { fail => sub { $_[0] == -1 } } ) };
use autodie qw(:all setpriority ioprio_set);

setpriority(
    PRIO_PROCESS,       # 1
    $$,
    19
);
ioprio_set(
    IOPRIO_WHO_PROCESS,                         # 1
    $$,
    IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 7)       # 0x4007
);

顺便说一句,您可以使用strace找到图书馆电话和类似内容。