2011-12-19 5 views
4

外部コマンドなしでスケジューリングやIOスケジューリングの優先順位を変更したLinux OS機能をPerlで実行できますか?私は、次のことをシミュレートしようとしています:Perlでスケジューリングの優先順位が変更されたRunnig OS関数

nice -n19 ionice -c2 -n7 cp largefile largefile2 

私は何とかファイルでこれを行うことができます::コピー、のsetpriority機能、およびCPANモジュールのLinux :: IO_Prio? $ 0のスケジューリング優先度を下げるだけでいいですか?

EDIT: 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: $!"; 

答えて

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`; 
関連する問題