gildot

Topo
Sobre
FAQ
Tópicos
Autores
Preferências
Artigos
Sondagens
Propor artigo


8/3
gildicas
9/30
jobs
10/9
perguntas
10/25
press

 
Como definir um timeout para um processo
Contribuído por vaf em 16-07-02 15:48
do departamento truques
perguntas MOks escreve "Viva,
Tenho um servidor Linux (Debian) que neste momento apenas está a servir páginas. Há pouco tempo descobri um scr1pt feito através do ICQ, que serve para enviar SMSs para a rede Optimus e Vodafone. Criei um interface Web para poder disponibilizar este serviço pela Internet.
O scr1pt funciona quase 90% das vezes mas, por vezes, o processo que faz a ligação ao ICQ e manda a mensagem, fica pendurado, juntando-se por vezes 3,4,5... processos que consomem quase sempre cerca de 90% do CPU.
Existe alguma forma de eu definir um timeout para cada processo de forma que ele se destrua automáticamente?"

o processo é chamado através do PHP:
exec('./send_message.pl +351123456567 '.$mensagem.'> /dev/null &');
A minha ideia era fazer qq coisa do género:
exec('./send_message.pl +351123456567 '.$mensagem.'> /dev/null &|set timeout 20minutos');

É obvio que 'set timeout 20minutos' não existe... :)

P.S. Andar a mecher no scr1pt perl não vale. Não conheço a linguagem... ;-)

Que música alternativa ? | Finalmente ficou provado que windows é superior ao Linux  >

 

gildot Login
Login:

Password:

Referências
  • Linux
  • Debian
  • MOks
  • Mais acerca perguntas
  • Também por vaf
  • Perguntas
  • Como se pode ter o seu próprio host ?
  • Linux preparado para 'enterprise'?
  • Produtividade: linha de comando vs IDE
  • Sistemas operativos: O que são?
  • linux distribuído nas revistas, sim ou não ?
  • Pergunte ao Gildot: qual o melhor codificador de mp3?
  • staroffice
  • Esta discussão foi arquivada. Não se pode acrescentar nenhum comentário.
    em perl é mais giro :P (Pontos:2)
    por Sub em 16-07-02 16:54 GMT (#1)
    (Utilizador Info)
    #!/usr/local/bin/perl

    &exec_timeout($self->{Timeout},
                                            sub {your_perl_code_here});

    sub exec_timeout
    {
            my ($timeout, $code) = @_;
            my $skipit = $^O eq 'MSWin32' || !$timeout;
            eval
            {
                    local $SIG{ALRM} = sub {die "timeout"} unless $skipit;
                    alarm($timeout) unless $skipit;
                    &$code();
            };
            alarm(0) unless $skipit; # Cancel the alarm
    }

    Re:em perl é mais giro :P (Pontos:2)
    por Strange em 16-07-02 17:31 GMT (#2)
    (Utilizador Info) http://strange.nsk.no-ip.org/

    A melhor maneira é mesmo alterando o scr1pt perl como indicaste.

    Uma maneira na shell:

    { sleep 120; kill $$; } & exec ./send_message.pl "$numero" "$mensagem"

    hugs
    Strange

    In php.net (Pontos:2)
    por vd em 16-07-02 18:31 GMT (#3)
    (Utilizador Info) http://paradigma.co.pt
    http://www.php.net/manual/en/function.socket-set-timeout.php

    Cumprimentos,
    vd
    Timeout (Pontos:2)
    por vd em 16-07-02 18:34 GMT (#4)
    (Utilizador Info) http://paradigma.co.pt
    http://www.php.net/manual/en/function.socket-set-timeout.php
    http://jakarta.apache.org/ant/manual/CoreTasks/exec.html

    Cumprimentos,
    vd
    PHP ???? (Pontos:1)
    por taf em 16-07-02 19:16 GMT (#5)
    (Utilizador Info)
    É raro verem-se ficheiros de PHP acabados em .pl ... mas pode ser só o meu mau feitio ...
    Re:PHP ???? (Pontos:1)
    por SlickFox em 16-07-02 19:36 GMT (#6)
    (Utilizador Info)
    Pelo que percebi o scr1pt "send_message.pl" é em perl, só que é chamado a partir de uma interface php..

    Cumps
    Perl ? (Pontos:0)
    por Anonimo Cobarde em 16-07-02 21:18 GMT (#8)
    Quer ele se ligue por socket, smtp ou http o modulo usado quase de certeza tem uma opcao de timeout. É uma questao de olhar para o scrit, ver o modulo usado e introduzir essa flag... nao deve custar muito.
    Warning... (Pontos:2, Esclarecedor)
    por Psiwar em 16-07-02 21:19 GMT (#9)
    (Utilizador Info) http://www.netcode.pt
    exec('./send_message.pl +351123456567 '.$mensagem.'> /dev/null &');

    ----------------
    Espero que a $mensagem tenha passado pelo escapeshellcmd() ou o escapeshellarg(). Senão $mensagem = "bla bla" | {inserir comando destruidor que vai correr com o user do web server).

    Ou seja, uses o que usares espero que estejas a escapar todos os chars que venham do form.


    http://www.php.net/manual/en/function.exec.php

    Funciona 90% das vezes ? (Pontos:0, Engraçado)
    por Anonimo Cobarde em 16-07-02 21:31 GMT (#11)
    Dá cá um confiança...
    Re:Funciona 90% das vezes ? (Pontos:2)
    por vd em 17-07-02 0:07 GMT (#12)
    (Utilizador Info) http://paradigma.co.pt
    Sempre e' melhor que funcionar 80% das vezes ;)


    Cumprimentos,
    vd
    Re:Funciona 90% das vezes ? (Pontos:2)
    por Karlus em 17-07-02 10:37 GMT (#14)
    (Utilizador Info) /dev/null
    Melhor mesmo é quando funciona 100%(link) das vezes. ;-)
    Comando timelimit (Pontos:2)
    por ribeiro em 17-07-02 5:22 GMT (#13)
    (Utilizador Info) http://ruka12.tripod.com
    Para correr comandos durante um periodo maximo de tempo, usa o timelimit.
    http://ringwraith.online.bg/devel/sys/timelimit/
    abraços,
    Rui Ribeiro
    --

     

     

    [ Topo | Sugerir artigo | Artigos anteriores | Sondagens passadas | FAQ | Editores | Preferências | Contacto ]