Pull to refresh

Comments 23

для таких задач неплохо бы использовать параллельные процессы, будет быстрее и скрипты зависать не будут
Проблема-то никуда не денется, завершение процесса всё равно придётся отслеживать и убивать «заработавшихся».

По теме — однажды занимался похожим при разработке скриптов автоматизированного тестирования. С тех пор жалею, что ulimit не способен ограничить реальное время работы приложения, только процессорное.
Сегодня как раз искал возможные решения и, наткнувшись на ulimit сначала несказанно обрадовался :) Пока не вчитался в описание.
а как? можете привести пример?
несколько замечаний:
есть функция posix_kill(PID, SIG);

проверять существование PID нужно посылая сигнал 0 через posix_kill или «kill -0 PID 2>/dev/null». Вернет 0 если PID существует и у вас есть права на него или 1 в обратном случае. В крайнем случае можно сделать file_exists('/proc/'.$PID); а парсить вывод ps весьма утомительное занятие.
Нуу а например на Фре нет /proc. Как быть тогда? А парсинг сработает в любом случае.
:)
Продакшн сервер с PHP на винде Ж) Отличное решение!)
Хорошо, когда там где нужна функция пишут именно функцию, а не изображают из себя мегО-программера и засовывают все в один класс не имея понятия зачем он как таковой вообще нужен. Простой и лаконичный код.
А еще есть функция pcntl_alarm для таймаутов. Которая через n секунд вызовет функцию-обработчик сигнала.

Вот за это низкий поклон, а то set_time_limit() не работает в php-cgi
Раз уж все равно запускается внешняя софтина, то я использую небольшую программку timelimit: devel.ringlet.net/sysutils/timelimit/
получается, что exec() возвращает управление до того, как завершилась запущенная команад?
Хороший велосипед :). Путь true линуксоида
зачем стока кода?

$command & pid=$! && sleep $timeout && kill -9 $pid

Зачем спать столько времени, если процесс завершит работу раньше таймаута?
Под этим пидом теортетически может быть запущен уже совершенно другой процесс.
Низачет.
ресурсов sleep почти не кушает.
что бы получился такой же пид нужно что бы прошло создание 32k процессов — практически нереальное событие, тем более за 5 секунд.

но в целом говнокод, согласен :)
да можно просто проверять время старта процесса
зато как сложно будет отлавливать этот баг, когда будет неожиданно умирать не тот процесс :)
Та же функция на Perl будет выглядеть так. Бессмысленный параметр sleep убран.

sub PsExecute {
    my $command = shift;
    my $timeout = shift || 10;
    my $output_file = shift || '/dev/null';
    my $child_pid = fork();
    defined($child_pid) or die "Couldn't fork(): $!\n";
    if ($child_pid == 0) {
        exec "$command > $output_file 2>&1";
    }
    local $SIG{ALRM} = sub {
        kill 9, $child_pid;
        die "Command `$command' timed out!\n";
    };
    alarm $timeout;
    waitpid $child_pid, 0;
    alarm 0;
}
Sign up to leave a comment.

Articles