¿Hay alguna forma de ejecutar procesos en segundo plano en Windows? nohup equivalente para windows

Respuestas:

8

Puede usar el comando de inicio para ejecutar un proceso en el fondo de la ventana de comandos.

command1
command2
start command3
command4

el comando2 espera hasta que termine el comando1 pero el comando4 no espera que el comando3 termine.

y si necesita ejecutar independientemente del usuario conectado, debe iniciar el proceso como un servicio y puede usar anysrv.exe

Aragorn
fuente
Según tengo entendido, el STARTcomando no se separa, es decir, sigue siendo un elemento secundario del proceso que lo creó. En su ejemplo, significará que 'command3' morirá cada vez que finalice el proceso madre. Unix evita esto haciendo que se conozca como un "tenedor dos veces", pero no sé de un equivalente en Windows.
unixhacker2010
al menos en Windows 7, el comando3 NO morirá, por ejemplo, puede ingresar a un mensaje de cmd "iniciar bloc de notas" y luego salir y el bloc de notas seguirá ejecutándose
Aragorn
Sí, tienes razón. Sin embargo, estaba probando desde otro idioma donde todo lo que puedo es exec(<some windows executable>). Puedo ver claramente en Process Explorer la relación padre-hijo y todo lo que empiezo desde dentro exec()no sobrevive. Corrija que parece funcionar si inicio un cmd.exemenú Inicio donde el proceso iniciado parece quedar huérfano 'correctamente' cuando cmd.exesale. Claramente necesito entender esto mejor. :-(
unixhacker2010
6

Es posible que desee ver los servicios de Windows. Hay algunas herramientas que puede descargar para alojar cualquier proceso como un servicio de Windows. Esto hace que el proceso se cargue en segundo plano al iniciar Windows, por lo que siempre que no requiera la interacción del usuario, debería poder alojarlo de esta manera.

Kit de recursos de Windows Server 2003

La herramienta que busca se llama srvany.exe.

Spence
fuente
5

La única forma, en Windows, de que un usuario pueda iniciar un proceso que continúa ejecutándose después del cierre de sesión (es decir, lo que hace "nohup") es iniciarlo a través de una "tarea programada" o como un servicio de Windows. Cuando el usuario cierra la sesión, todos los procesos en su sesión de inicio de sesión se eliminarán.

Si quieres probar el método de "Tareas programadas", querrás saber cómo crearlas mediante programación. La clase WMI Win32_ScheduledJob puede hacerlo. La documentación se proporciona en detalle aquí: http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true Básicamente, lo que está buscando es hacer (descaradamente robado de 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

Para conceder al "usuario joe" la capacidad de crear tareas programadas, deberá modificar el permiso en la carpeta% SystemRoot% \ Tasks. Consulte aquí para obtener información sobre ese frente: http://technet.microsoft.com/en-us/library/cc785125(WS.10).aspx

Evan Anderson
fuente
¿Cuál es la ventaja de hacer esto frente al uso de schtasks.exe o la GUI del Programador de tareas?
Helvick
No hay mucha diferencia funcional entre esta API y schtasks.exe. La ventaja de la GUI es que puede hacer esto mediante programación.
Evan Anderson
0

Todo esto depende de cuál sea su propósito final. Puede ejecutar una tarea programada con la opción de ejecutar solo si el usuario ha iniciado sesión configurado en DESACTIVADO. Posiblemente podría usar psexec desde una máquina remota. Mejor aún podría ser ejecutar el proceso como un servicio. Eche un vistazo a esta búsqueda de Google , esta otra búsqueda de Google , este hilo y este otro hilo para encontrar posibles clientes potenciales en su búsqueda de una solución. En última instancia, parece que no hay un equivalente exacto de nohup en una máquina con Windows.

Wesley
fuente
Mi objetivo final es ocultar el proceso al usuario. Oculta las ventanas que genera.
Jader Dias el