nohup esegue un processo in background. C'è qualche equivalente per Windows?
nohup esegue un processo in background. C'è qualche equivalente per Windows?
Risposte:
È possibile utilizzare il comando start per eseguire un processo in background nella finestra di comando.
command1
command2
start command3
command4
command2 attende fino al termine di command1 ma command4 non aspetta che il comando3 finisca.
e se è necessario eseguire indipendentemente dall'utente che ha effettuato l'accesso, è necessario avviare il processo come servizio ed è possibile utilizzare anysrv.exe
exec(<some windows executable>)
. Riesco a vedere chiaramente in Process Explorer la relazione genitore-figlio e qualunque cosa io abbia inizio dall'interno exec()
non sopravvive. Corretto che sembra funzionare se avvio un cmd.exe
dal menu Start in cui il processo avviato sembra essere orfano 'correttamente' quando cmd.exe
esce. Chiaramente ho bisogno di capirlo meglio. :-(
Potresti voler dare un'occhiata ai servizi di Windows. Esistono alcuni strumenti che è possibile scaricare per ospitare qualsiasi processo come servizio Windows. Questo fa sì che il processo si carichi in background all'avvio di Windows, quindi purché non richieda l'interazione dell'utente dovresti essere in grado di ospitarlo in questo modo.
Resource Kit di Windows Server 2003
Lo strumento che stai cercando si chiama srvany.exe.
L'unico modo, in Windows, per cui un utente può avviare un processo che continua l'esecuzione dopo la disconnessione (ovvero cosa fa "nohup") è avviarlo tramite un "task pianificato" o come un servizio Windows. Quando l'utente si disconnette, tutti i processi nella sessione di accesso verranno interrotti.
Se stai provando il metodo "Attività pianificate", vorrai sapere come crearli a livello di codice. La classe WMI Win32_ScheduledJob può farlo. La documentazione è fornita in dettaglio qui: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true Fondamentalmente, stai guardando a fare (spudoratamente rubato da Microsoft):
Set objService = GetObject("winmgmts:\\.")
Set objNewJob = objService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create("Program-to-execute.exe", "ugly-formatted-time-string-per-Microsoft-docs",True ,1 OR 4 OR 16, , ,JobID)
If Err.Number = 0 Then
Wscript.Echo "New Job ID: " & JobID
Else
Wscript.Echo "An error occurred: " & errJobCreated
End If
Per garantire a "utente joe" la possibilità di creare attività pianificate, è necessario modificare l'autorizzazione nella cartella% SystemRoot% \ Tasks. Vedi qui per alcune informazioni su questo fronte: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx
Tutto dipende da quale sia il tuo scopo ultimo. È possibile eseguire un'attività pianificata con l'opzione per eseguire solo se l'utente è connesso impostato su DISABILITATO. È possibile utilizzare psexec da un computer remoto. Meglio ancora potrebbe essere quello di eseguire il processo come servizio. Dai un'occhiata a questa ricerca di Google , a questa altra ricerca di Google , a questa discussione e a questa altra discussione per alcuni possibili contatti nella ricerca di una soluzione. Alla fine sembra che non ci sia un equivalente esatto di nohup su un computer Windows.
START
comando non fa distacco, cioè è ancora figlio del processo che lo ha creato. Nel tuo esempio, significherà che "command3" morirà ogni volta che termina il processo madre. Unix aggira questo fatto facendo era noto come "fork-two" ma non conosco un equivalente in Windows.