nohup exécute un processus en arrière-plan. Y a-t-il un équivalent pour Windows?
nohup exécute un processus en arrière-plan. Y a-t-il un équivalent pour Windows?
Réponses:
Vous pouvez utiliser la commande de démarrage pour exécuter un processus en arrière-plan de la fenêtre de commande.
command1
command2
start command3
command4
command2 attend la fin de command1 mais command4 n'attend pas que command3 se termine.
et si vous devez exécuter indépendamment de l'utilisateur connecté, vous devez démarrer le processus en tant que service et vous pouvez utiliser anysrv.exe
exec(<some windows executable>)
. Je peux voir clairement dans Process Explorer la relation parent-enfant et tout ce que je commence de l'intérieur exec()
ne survit pas. Corrigez qu'il semble fonctionner si je démarre un cmd.exe
menu Démarrer où le processus démarré semble être orphelin «correctement» à la cmd.exe
sortie. De toute évidence, je dois mieux comprendre cela. :-(
Vous voudrez peut-être regarder les services Windows. Il existe des outils que vous pouvez télécharger pour héberger n'importe quel processus en tant que service Windows. Cela provoque le chargement du processus en arrière-plan au démarrage de Windows, donc à condition qu'il ne nécessite pas d'interaction avec l'utilisateur, vous devriez pouvoir l'héberger comme ceci.
Kit de ressources Windows Server 2003
L'outil que vous recherchez s'appelle srvany.exe.
La seule façon, sous Windows, qu'un processus démarré par un utilisateur continue de s'exécuter après la fermeture de session (c'est-à-dire ce que fait "nohup") est de le démarrer soit via une "tâche planifiée" soit en tant que service Windows. Lorsque l'utilisateur se déconnecte, tous les processus de sa session de connexion sont supprimés.
Si vous êtes prêt à essayer la méthode "Tâches planifiées", vous voudrez savoir comment les créer par programme. La classe WMI Win32_ScheduledJob peut le faire. La documentation est fournie en détail ici: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true Fondamentalement, vous cherchez à faire (sans vergogne volé à 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
Pour accorder à "l'utilisateur joe" la possibilité de créer des tâches planifiées, vous devrez modifier l'autorisation sur le dossier% SystemRoot% \ Tasks. Voir ici pour quelques informations à ce sujet: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx
Tout dépend de votre objectif ultime. Vous pouvez exécuter une tâche planifiée avec l'option de s'exécuter uniquement si l'utilisateur est connecté défini sur DÉSACTIVÉ. Vous pouvez éventuellement utiliser psexec à partir d'une machine distante. Mieux encore pourrait être d'exécuter le processus en tant que service. Consultez cette recherche Google , cette autre recherche Google , ce fil et cet autre fil pour trouver des pistes possibles dans votre recherche d'une solution. En fin de compte, il semble qu'il n'y ait pas d' équivalent exact à nohup sur une machine Windows.
START
commande ne fait pas de détachement, c'est-à-dire qu'elle est toujours un enfant du processus qui l'a créée. Dans votre exemple, cela signifiera que «command3» mourra chaque fois que le processus mère se terminera. Unix contourne cela en le faisant était connu comme un 'fork-deux fois' mais je ne connais pas d'équivalent dans Windows.