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 весьма утомительное занятие.
есть функция posix_kill(PID, SIG);
проверять существование PID нужно посылая сигнал 0 через posix_kill или «kill -0 PID 2>/dev/null». Вернет 0 если PID существует и у вас есть права на него или 1 в обратном случае. В крайнем случае можно сделать file_exists('/proc/'.$PID); а парсить вывод ps весьма утомительное занятие.
Хорошо, когда там где нужна функция пишут именно функцию, а не изображают из себя мегО-программера и засовывают все в один класс не имея понятия зачем он как таковой вообще нужен. Простой и лаконичный код.
А еще есть функция pcntl_alarm для таймаутов. Которая через n секунд вызовет функцию-обработчик сигнала.
Раз уж все равно запускается внешняя софтина, то я использую небольшую программку timelimit: devel.ringlet.net/sysutils/timelimit/
получается, что exec() возвращает управление до того, как завершилась запущенная команад?
Хороший велосипед :). Путь true линуксоида
зачем стока кода?
$command & pid=$! && sleep $timeout && kill -9 $pid
$command & pid=$! && sleep $timeout && kill -9 $pid
Зачем спать столько времени, если процесс завершит работу раньше таймаута?
Под этим пидом теортетически может быть запущен уже совершенно другой процесс.
Низачет.
Под этим пидом теортетически может быть запущен уже совершенно другой процесс.
Низачет.
Та же функция на 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; }
А еще есть клёвая софтина, которая поможет выдрать инфу о видео файлах:
mediainfo.sourceforge.net/en
mediainfo.sourceforge.net/en
Sign up to leave a comment.
Установить время выполнения консольной команды