Ho un servizio che a volte richiama un file batch. Il file batch richiede 5-10 secondi per eseguire: il file esiste e il codice funziona quando faccio funzionare lo stesso codice in-console. Tuttavia quando viene eseguito all'interno del servizio, si blocca fino a WaitForExit (). Devo uccidere il file batch dal Processo per continuare. (Sono certo il file esiste, come posso vedere nella lista dei processi.) Come posso risolvere questo problema Update 1 hang-up: il codice Kevins mi permette di ottenere in uscita. Uno dei miei file batch è ancora appeso. C: EnterpriseDBPostgres8.3binpgdump. exe - i - h localhost - p 5432 Postgres - U - F p - a - D - v - fc: backupcasecocherbackupdateevent2008.sql - t public. dateevent dbTest L'altro file batch è: C: EnterpriseDBPostgres8.3binvacuumdb. exe - U postgres - d dbTest ho controllato il percorso e il percorso PostgreSQL è bene. La directory di output esiste e funziona ancora fuori del servizio. Tutte le idee Aggiornamento 2: anziché il percorso del file batch, ho scritto il C: EnterpriseDBPostgres8.3binpgdump. exe per la proc. StartInfo. FileName e aggiunti tutti i parametri di proc. StartInfo. Arguments. I risultati sono invariati, ma vedo il pgdump. exe nella finestra di processo. Anche questo avviene solo all'interno del servizio. UPDATE 3: Ho eseguito il servizio con un utente nel gruppo di amministratori, senza alcun risultato. Ho ripristinato nullo per il nome utente e la password servizi di aggiornamento 4: ho creato un semplice servizio di scrivere una traccia nel registro eventi ed eseguire un file batch che contiene dir in esso. Sarà ora appendere al proc. Start () - Ho provato a cambiare l'account da LocalSystem a Utente e impostare l'utente admnistrator e la password, ancora niente. using System utilizzando System. Collections. Generic utilizzando System. Linq utilizzando System. Text using System. Diagnostics stringa namespace VG targetDir string. Format (D: adapterssetup) questo è dove si trova mybatch. bat proc nuovo processo () proc. StartInfo. WorkingDirectory targetDir proc. StartInfo. FileName mybatch. bat proc. StartInfo. Arguments string. Format (10) questo è argomento proc. StartInfo. CreateNoWindow falso proc. Start () proc. WaitForExit () catch (Exception ex),, ex. Message, ex. StackTrace. ToString ()) risponde 7 gennaio 10 presso 9:47 Cosa fa il file batch fare Sei certo il processo è sempre lanciato con sufficiente privs per eseguire il file batch di servizi possono essere limitati in ciò che possono fare. Assicurarsi inoltre se si sta facendo qualcosa di simile usin il comando di copia per sovrascrivere un file che si fa qualcosa di simile: Inoltre, assicurarsi che si sta utilizzando percorsi completi per i comandi batch, ecc Se il file batch sta lanciando una applicazione GUI in qualche sorta di modalità Console, che può essere un problema troppo. Ricordate, i servizi non avete un desktop (a meno che non si attiva l'interagire con il desktop) per disegnare qualsiasi tipo di finestre o finestre di messaggio a. Nel programma, si potrebbe desiderare di aprire i tubi stdout e stderr e leggere da loro durante l'esecuzione nel caso in cui si stanno ottenendo eventuali messaggi di errore o altro. WebServices sono probabilmente in esecuzione come l'account IUSR, o l'account anonimo, che mai, in modo che possa essere un problema per voi. Se funziona quando lo si esegue in console, questo è solo il primo passo. ) Non mi ricordo se System. Diagnostics. sono disponibili solo in debug o meno. Probabilmente no, ma alcuni di essi potrebbero essere. Ill dovuto controllare su quella per te. Spero che questo ti dà qualche idea. risposto 11 dicembre 08 alle 21:58 pgdump. exe è probabilmente richiesta di conferma per l'input dell'utente. Questo database richiedono l'autenticazione Stai fare affidamento su qualsiasi variabili d'ambiente che essere abituato presenti per il servizio Non so pgdump Ma quali sono le altre possibili ragioni che avrebbe spinto per l'ingresso risposto 12 dicembre 08 alle 15:10 posso fare questo comando dalla linea di comando di cmd. exe e funziona senza chiedere conferma. ndash Patrick Desjardins 12 dicembre 08 alle 15:25 Il prossimo passo vorrei prendere è quello di avviare il debugger, e vedere se si può dire ciò che il programma è in attesa. Se si expierenced al debug in assemblea, si può essere in grado di avere un'idea di che cosa sta accadendo utilizzando strumenti come Procexp, FileMon, ecc Essendo un servizio di Windows, e non un servizio web, fa un po 'di differenza. In ogni modo, hai provato il mio suggerimento di impostare la Consenti al servizio di interagire con il desktop Se siete disperati, si potrebbe provare il lancio cmd. exe invece di file batch. Poi, utilizzando i cmd. exes cmd parametri di linea, si può avere avviare il file batch. Ciò probabilmente vi darà una finestra del prompt cmd per visualizzare l'uscita effettiva, se si accende il interagire con il desktop. Per informazioni complete su cmd. exe, basta digitare cmd in qualsiasi codice di comando prompt. The assomiglia quasi questo: Come si può vedere, il codice avvia un processo cmd. exe e passa ad essa il comando che voglio da eseguire. Rioriento StandardError e StandarOutput per leggerli dal codice. Il codice li legge prima del processo. WaitForExit (Timeout) chiamata come raccomandato da Microsoft (ne parleremo più avanti). Il problema sorge se il comando mando a cmd. exe non termina o si blocca a tempo indeterminato. Nel codice che ho usato il comando ping - t 8.8.8.8 che, a causa del l'opzione - t, ping l'ospite senza fermarsi. Cosa succede Il processo cmd. exe insieme con il comando - t ping mai uscite e non chiude mai il flusso stdout e così il nostro codice si blocca al () Linea process. StandardOutput. ReadToEnd uscita perché cant riescono a leggere tutto il flusso. Lo stesso accade anche se un comando in un file batch si blocca per qualsiasi motivo e in modo che il codice di cui sopra potrebbe funzionare continuamente per anni e poi appendere improvvisamente senza alcun motivo apparente. Prima ho scritto che la sua consiglia di leggere i flussi reindirizzate prima del processo. WaitForExit (Timeout) chiamata, e questo è particolarmente vero se si utilizza la firma WaitForExit senza il timeout. Se si chiama processo. WaitForExit () prima di leggere i flussi reindirizzati: codice 2: si può sperimentare un deadlock se il comando si collega alla cmd. exe o il processo che si sta chiamando riempie l'output standard o standard error. Questo perché il nostro codice sopraelevazione raggiungere le linee di processo di uscita. StandardOutput. ReadToEnd () È un dato di fatto del processo figlio (il comando ping o un file batch o un processo che si sta eseguendo qualsiasi altra cosa) potete andare sul se il nostro programma di doesnt leggere i buffer piene dei corsi d'acqua e questo cant accadere perché il codice è appesa a la linea con processo. WaitForExit (), che aspettare per sempre per il progetto figlio per uscire. La dimensione predefinita di entrambi i flussi è di 4096 byte. È possibile verificare questo due dimensioni con questi file batch: Il primo script scrive 4096 byte standard output e il secondo di errore standard. Salvare uno di questi in C: testbuffsize. bat ed eseguire il nostro processo di programma chiamante. WaitForExit () prima del processo di uscita. StandardOutput. ReadToEnd (), come nel codice 2. è possibile farlo scrivendo CommandResult Risultato ExecuteShellCommandSync (c: testbuffsize. bat, 1000) alla riga 13 del codice 1. Il codice solito appendere ma se si scrive un altro byte in uno qualsiasi dei due corsi d'acqua che sarà traboccare la dimensione del buffer rendendo il programma appendere. Se avete bisogno di reindirizzare e leggere l'errore di uscita o standar di serie la soluzione migliore è quella di leggere in modo asincrono. Un ottimo modo per fare questo è proposto da Mark Byers in questa discussione StackOverflow come l'ultima cosa si prega di notare che se il processo figlio esce solo perché si utilizza il processo. WaitForExit (Timeout) firma e va effettivamente in timeout si dovrebbe uccidere il processo di cmd. exe e le sue possibili figli.
No comments:
Post a Comment