2011-12-19 1 views
4

Возможно ли, что Perl запускает ОС Linux с измененным приоритетом планирования и/или IO при отсутствии внешних команд? Я пытаюсь моделировать следующее:Функции Runnig OS с измененным приоритетом планирования в Perl

nice -n19 ionice -c2 -n7 cp largefile largefile2 

Могу ли я каким-то образом сделать это с помощью File :: Copy, функция SetPriority и модуль CPAN Linux :: IO_Prio? Мне просто нужно снизить приоритет планирования в $ 0?

EDIT: Если я сделаю следующее, приоритет и 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 Refining:

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`; 
Смежные вопросы