Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Нужно убить все процессы


Автор: Igоr 4.1.2006, 18:28
привет.
есть скрипт, который будет работать в бесконечном цикле, но нужен способ как-нибудь его остановить по требованию. Как сделать?

Спасибо

Автор: sharq 4.1.2006, 18:35
Igоr можно написать обработчик на нажатие Ctrl-C или другие клавишы, при нажатие на кот. срабатывавет last в цикле.

smile

Автор: Igоr 4.1.2006, 20:01
Извините если туплю, но я так понял, что метод, который вы предлагаете применим при запуске скрипта из консоли?
В моей ситуации скрипт запускается из веба.

Автор: sharq 5.1.2006, 00:35
Igоr
Цитата(Igоr @ 4.1.2006, 21:01 Найти цитируемый пост)

метод, который вы предлагаете применим при запуске скрипта из консоли

да. smile

Цитата(Igоr @ 4.1.2006, 21:01 Найти цитируемый пост)

В моей ситуации скрипт запускается из веба.

Тогда подробнее опиши ситуацию.

smile

Автор: Igоr 5.1.2006, 13:51
Ситуация следующая, есть скрипт, который получает массив урлов и гетит их, после того как пройдет весь список по одному разу нужно возобновить цикл и так далее... но не до бесконечности конечно smile, при этом в веб выдает результаты запроса, ну вот мне нужно какую-нить кнопку нажать и убить этот цикл smile
Доступа к консоли нет.

Автор: korob2001 5.1.2006, 21:39
Цитата

Ситуация следующая, есть скрипт, который получает массив урлов и гетит их, после того как пройдет весь список по одному разу нужно возобновить цикл и так далее... 

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

ну вот мне нужно какую-нить кнопку нажать и убить этот цикл.
Доступа к консоли нет.

smile Как так? Доступа к консоли нет, но ты же пишешь программу на Perl, откуда ты можешь дать практически любую системную команду. С кнопочкой наверное ничего не получится, а если и получится, то это будет не CGI програма. Тебе нужно писать приложение "клиет-сервер", где клиент прогрмма которая будет находиться у тебя на машине, если нужна кнопочка, то пишешь на Tk под неё GUI. Она будет связываться с сервером, который будет слушать определённый порт, работать такой сервер (демон), должен в фоновом режиме. Потому как, сколько будет рабоать этот цикл известно одному богу и тебе. smile

Автор: sharq 6.1.2006, 18:28
Igоr можно сделать так, конечно, не самый простой способ. smile
Написать отдельно скрипт, который при нажатие на кнопочку, т.е. при посылке ему опрделенного запроса, делал бы следующее - искал бы в процессах запущенный твой скрипт и удалял его при помощи команды kill.

На самом деле, можно сделать запуск твоего скрипта по расписанию через cron и тогда не требуется его обрывать, пусть работает как часы.

smile

Автор: popkorn 4.2.2006, 16:24
при посылке скрипту определенного параметра, выполняется :

@info = `ps aux`;
foreach $a(@info){
if ($a =~ /название_скрипта/ ){
@ar=split(/ /,$a);
`kill -9 "@ar[1]"`;
};
}

Автор: Usya 22.2.2006, 08:05
Небольшой вопрос вдогонку.

Как убить зависший процесс и быть уверенным, что он точно убит?
Либо, практически то же самое, - как определить PID зависшего (текущих) процессов?

smile
Заранее благодарен.

Автор: chaos 22.2.2006, 10:47
smile smile smile
Код

system('reboot');
#или
system('poweroff');

Автор: tishaishii 22.2.2006, 16:46
Код
`kill -9 $pid` until undef

Добавлено @ 16:47
smile

Автор: Usya 23.2.2006, 10:41
chaos, tishaishii
Спасибо за ответы, но мне не надо убивать абсолютно все процессы, тем более перезагружать систему. Да и правов у меня таких нет. Попробую перефразировать вопрос:

Как определить PID процесса (если более конкретно, то cgi-скрипта), чтобы при необходимости можно было его убить?
При этом определить PID нужно из внешней проги.
Или, в крайнем случае, необходимо определить PID-ы всех процессов (cgi-скриптов), а какой из них убить, там уже сам решу smile

Автор: tishaishii 23.2.2006, 18:05
Код
use Win32::OLE;
use Win32::OLE::Enum;

$loc=Win32::OLE->new('WbemScripting.SWbemLocator');
$serv=$loc->ConnectServer('.','root\\cimv2');
$procs=$serv->ExecQuery(<<'.');
    SELECT
        *

    FROM
        Win32_Process

    WHERE
        (Name='perl.exe')
.

@ps=Win32::OLE::Enum->new($procs)->All;
$count=scalar @ps;

($VirtualSize, $ThreadCount, $KernelModeTime, $UserModeTime)=(0, 0, 0, 0);

%count=(
    HandleCount=>0,
    KernelModeTime=>0,
    OtherOperationCount=>0,
    OtherTransferCount=>0,
    PageFaults=>0,
    PageFileUsage=>0,
    PeakPageFileUsage=>0,
    PeakWorkingSetSize=>0,
    PrivatePageCount=>0,
    QuotaNonPagedPoolUsage=>0,
    QuotaPeakNonPagedPoolUsage=>0,
    QuotaPeakPagedPoolUsage=>0,
    ReadOperationCount=>0,
    ReadTransferCount=>0,
    UserModeTime=>0,
    ThreadCount=>0,
    VirtualSize=>0,
    WorkingSetSize=>0,
    WriteOperationCount=>0,
    WriteTransferCount=>0
);

@keys=split /[\r\n]+/os, <<'.';
CreationDate
Handle
HandleCount
KernelModeTime
MaximumWorkingSetSize
MinimumWorkingSetSize
OtherOperationCount
OtherTransferCount
PageFaults
PageFileUsage
ParentProcessId
PeakPageFileUsage
PeakVirtualSize
PeakWorkingSetSize
Priority
PrivatePageCount
ProcessId
QuotaNonPagedPoolUsage
QuotaPagedPoolUsage
QuotaPeakNonPagedPoolUsage
QuotaPeakPagedPoolUsage
ReadOperationCount
ReadTransferCount
ThreadCount
UserModeTime
VirtualSize
WindowsVersion
WorkingSetSize
WriteOperationCount
WriteTransferCount
.
ну и так далее...
Перечислены не все свойства. Все свойства процессов можно узнать здесь:
Код

            <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_process.asp" target="$http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_process.asp">Документация</a>

Автор: Usya 24.2.2006, 05:34
tishaishii, все конечно хорошо.
С предложенным щас постараюсь разобраться, но есть ли что-либо универсальное, не зависящее от операционки?
Я имею ввиду винду и линухи/юнихи.

Автор: korob2001 24.2.2006, 10:08
Цитата(chaos @ 22.2.2006, 07:47 Найти цитируемый пост)

Код
   
system('reboot');
#или
system('poweroff');


Цитата(tishaishii @ 22.2.2006, 13:46 Найти цитируемый пост)

Код

`kill -9 $pid` until undef


smile Я плакал. ;)))

Автор: Usya 25.2.2006, 06:54
Есть и более простые способы.
Например, просто выключить питание и всеееееее!!!

Есть какие-нибудь дельные советы smile

Автор: nitr 25.2.2006, 20:03
Думаю можно с помощью "сигналов" сделать... читай perlsec

Автор: zedik38 1.4.2012, 20:38
хочу получить pid запущенного процесса, на bash получается так:
Код

ps afx | awk '/myprog/ {print $1}'


при использовании
Код

$pid=`ps afx | awk '/myprog/ {print $1}'`; 

пишет всю строку,а не только pid процесса.
помогите результат данного фрагмента закинуть в переменную на perl ?

Автор: arto 2.4.2012, 07:48
\$1

Автор: FishHunter 4.4.2012, 20:38
блин ... некроманты smile

Автор: od0201 5.4.2012, 16:02
если у вас нет прав, то и "вечно" он не сможет,  мне хостер 30 сек дает
отвечу, как понял вопрос , если веб

есть список урлов, вытаскиваем первый, обрабатываем, получаем новый список, "кладем в конец" и перегружаем скрипт
Код

print qq~<script language='Javascript'> setTimeout("location.href='index.cgi'",2000);<\/script>~;


В любой момент можем остановить и продолжить. Но рекомендую встроить механиз защиты от вторичного запуска.

Остановить, 4 варианта
- кнопочка "стоп в браузере" (мой выбор)
- ориентируемся на 0 или 1 в переменной, и решаем продолжать или нет
- ориентируемся на 0 или 1 в файле флаг.тхт, и решаем продолжать или нет
- ориентируемся на 0 или 1 в куках и решаем продолжать или нет (глупо, но реализовать можно)
0 или 1 выставляем кнопочкой в форме запуская при этом этот же скрипт (в З.Ы. описана проблема проблема прорисовки кнопочки)

для отображения статистики/хода работы
Код

print "<div id='proc'>run.....</div>    <script> function Run(i)  {document.getElementById('proc').innerHTML = i;    }    </SCRIPT>    
for $i(0..$#урл){
  print "<script> Run('performed ". int ((100/($#урл+1))*($i+1)) ." \% - ".$урл[$i]."')</SCRIPT> ";
 # код по данному урлу
}


З.Ы.но во всем этом есть и проблема, прорисовка в разных браузерах будет не всегда вовремя, здесь "поиграться" нужно, в ИЭ работает на ура.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)