Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: exec() bloca cmd.exe

  1. #1

    exec() bloca cmd.exe

    Ciao a tutti,

    Quando sul Win2003 (Apache 2.0.54 + PHP 5) utilizzo exec() o system(), una volta su 5 cmd.exe, che viene eseguito, rimane bloccato. Di consegenza pagina viene bloccata e tutte istruzioni exec() o system() eseguite successivamente rimangono bloccate finche non eseguo net stop e net start apache.

    Stesso software sul Win2000 non si blocca mai !

    Qualcuno ha qualche idea?

    gruyoman

    P.S.
    Per eseere più preciso system() utilizzo per esegire commandi su ImageMagick mentre exec() per eseguire nslookup

  2. #2
    Utente di HTML.it L'avatar di aserena
    Registrato dal
    Feb 2003
    Messaggi
    310
    Dovrebbe essere un problema di sicurezza, e in particolare di permessi.
    Fai una prova: cerca il file cmd.exe, aggiungi l'utente everyone dando pieni privilegi, e stai a vedere.

    Ciao
    La (!) è quella roba che in autunno si intristisce... perche': seccano i piselli, migrano gli uccelli, cadono i marroni, e se poi c'è anche la nebbia non si vede più un caXXo!! by Piero.mac @07/05

  3. #3
    Ho già dato il permesso everyone.
    La cosa strana è che non lo fa subito. Alcune operazioni le esegue e dopo 2, 3 o 4 che vanno a buon fine (quindi cmd.exe si apre e chiude regolarmente) crolla, cioè si blocca.
    Riavvio Apache (che tiene cmd.exe bloccati, non è possibile ne anche kill-arli) e tutto torna normale.

    gruyoman

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    8
    so che è un post vecchissimo, ma mi succede la stessa cosa.

    sistema windows 2003.
    Windows NT SERVER01 5.2 build 3790
    xampp 1.6.7

    Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h mod_autoindex_color PHP/5.2.6


    ho provato anche shell_exec, system, exec ma nulla.
    va bene per qualche giorno (con una decina di lanci in totale) e poi
    si pianta.

    i processi rimangono appesi e non si riesce ad ucciderli.

    per risolvere devo solo riavviare apache.

    che succede?

    grazie
    ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    8
    ho provato anche a cambiare l'account di avvio al servizio
    di apache (da system a administrator), ma nulla da fare...

    HELPPPPPPPPPP

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    8
    mi sono accorto che cmd.exe non aveva permessi di everyone.
    li ho messi.

    ma non capisco se c'entra sta cosa o no,
    perchè per 2 giorni funziona e poi di colpo si pianta?
    se fosse questione di permessi non dovrebbe andare mai....

  7. #7
    direi che forse è da rivedere un attimo il tuo codice

    anche perché, magari, al posto di exec per startare cmd ti converrebbe dare un occhio alle api per gestire l'input/output (IO) dei processi:

    www.php.net/popen
    www.php.net/pclose

    o, ancora meglio:

    www.php.net/proc_open
    www.php.net/proc_get_status
    www.php.net/proc_close
    www.php.net/proc_terminate

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    8
    il codice:

    $cmd_print = $stampaFile.' -p "'.$stampante.'" '.$copie_text.$fronteretro_text.' "'.$spoolDir.$nomeFile .'" ';

    $res = system("start /B ". $cmd_print, $output);

    (all'interno di un ciclo sui file scelti)

    dove:
    $stampafile è c:\...\pdfp.exe (apre acroread32.exe per la stampa PDF)
    $stampante è \\\\server\\stampante1
    $copie_text è pieno se han scelto + copie con -c #copie
    $fronteretro_text è pieno se han scelto fronte/retro con -d #nfronteretro
    $spoolDir.$nomefile è c:\\...\\...\\file#ennesimo.pdf

    ma la stessa cosa succede anche senza pdfp.exe, lanciando un vb compilato che carica Acroread32 passando il file come paarametro.

    questo è un esempio, ho un'altra pagina che lancia un exec('copy con file.txt \\server\stampante1 ') che da lo stesso problema.
    non credo c'entri il lancio del comando, anche perchè ho già cambiato tutti i tipi (exec, shellexec, system, popen...).
    so che se sbagli riga di comando rimane in attesa, ma ho già verificato che la riga di comando sia corretta provandola direttamente da cmd.

    ho già provato popen e pclose, ma sì non blocca la pagina (mentre system da l'output e attende l'esito), però poi magari stampa 4 pdf su 20 scelti.

    ora invece guardo le proc* che non ho mai visto.

    intanto grazie.

    ciao!

  9. #9
    direi che innanzi tutto non avvii direttamente cmd.exe, bensì un software che serve a mandare in stampa, e fa una gran differenza ti assicuro

    dopo di che perché non provi ad usare ghostscript? è gratuito, è semplice, ed è fatto per funzionare da linea di comando

    basta che imposti il funzionamento in modalità QUIET e BATCH mentre come output gli dici che deve utilizzare il sistema di stampa di windows cosi gli passi quale stampante e l'elenco dei file pdf da mandare in stampa!

    Riguardo l'attesa, se usi pe funzioni proc* o p* puoi avviare ghostscript in quel modo e se ti invia un output per singola pagina stampata (eventualmente mettendo ghostscript in modalità verbosa) puoi inviare TUTTO il contenuto della pagina prima di iniziare la stampa, non chiudi il body e per aggiornare la pagina mentre ancora il sistema sta lavorando invii un blocco di codice javascript che va ad aggiornare una barra di progressione o un testo informativo e cosi via!

    Ovviamente mentre attendi la stampa ti conviene usare il set_time_limit in modo da evitare il blocco della pagina dopo 30 secondi!

    Con questo sistemino semplice semplice puoi avere più controllo sul processo di stampa, puoi aggiornare l'utente sullo stato e soprattutto eviti di incappare in questo problemi!

    Per finire ... non avrai più la necessità di dover far funzionare tutto su windows ma potrai anche passare ad usare linux (anche sempre usando ghostscript)

    In alternativa, per php su windows esiste un'estensione per controllare le stampanti
    http://pecl.php.net/package/printer
    http://it.php.net/printer

    Ad esempio tramite
    http://it.php.net/manual/en/function.printer-list.php

    puoi elencare le stampanti collegate al sistema o le stampanti presenti su quel dato client presenti nel sistema (cosi da permette di stampare direttamente sulla stampante del client se questa è installata sul server)

    insomma, si ci può giocare un pò

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    8
    si concordo, è un programma esterno, ma ti assicuro che anche lanciando direttamente acroread non cambia nulla.

    avevo guardato anche quello (ghostscript) ma quello che ho visto io aveva una licenza particolare, non mi pareva gratis...

    il discorso di popen...mi andava benissimo che non rimanesse in attesa, ma se poi non
    esegue il comando ....

    avevo già aumentato il timelimit con un ini set.

    se il cliente avesse un server linux sarebbe stato tutto più facile... ;-)

    vorrei provare le proc_*, sembrano interessanti.

    e poi anche il package printer, probabilmente mi darebbe una grossa mano,
    ammesso che cmq non sia un problema di apache e cmd.exe

    grazie dell'aiuto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.