2011-12-19 18 views
4

是否有可能讓Perl運行帶有修改的調度和/或IO調度優先級的Linux OS函數而無需外部命令?我試圖模擬以下內容:在Perl中具有修改的調度優先級的Runnig OS函數

nice -n19 ionice -c2 -n7 cp largefile largefile2 

我可以以某種方式與文件::複製的setpriority功能,以及CPAN模塊的Linux :: IO_Prio做到這一點?我只需要降低$ 0的調度優先級?

編輯: 如果我做了以下將優先級和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: $!"; 

回答

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

1

您可能是最好的,只需根據需要更改當前運行的pid的優先級即可。當然不是可移植的,但是這樣做本身並不便攜。任何執行這種事情的東西都會歸結爲使外部命令執行相同的庫調用。

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