Esiste un modo per eseguire processi in background in Windows? nohup equivalente per windows


Risposte:


8

È 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


Per quanto ho capito il STARTcomando 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.
unixhacker2010,

almeno su Windows 7 il comando3 NON morirà, ad esempio puoi entrare in un prompt cmd "avvia blocco note" quindi esci e il blocco note sarà ancora in esecuzione
Aragorn

Sì, hai ragione. Tuttavia stavo testando da un'altra lingua in cui tutto ciò che posso è 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.exedal menu Start in cui il processo avviato sembra essere orfano 'correttamente' quando cmd.exeesce. Chiaramente ho bisogno di capirlo meglio. :-(
unixhacker2010,

6

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.


5

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


Qual è il vantaggio di fare questo rispetto all'utilizzo di schtasks.exe o della GUI di Utilità di pianificazione?
Helvick,

Non c'è molta differenza funzionale tra questa API e schtasks.exe. Il vantaggio della GUI è che puoi farlo a livello di codice.
Evan Anderson,

0

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.


Il mio scopo finale è nascondere il processo all'utente. Nascondi le finestre che genera.
Jader Dias,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.