Gestión de procesos y servicios desde Shell Script en Windows

Aprende de una vez por todas cómo gestionar procesos y servicios que están corriendo y siendo lanzados en el sistema operativo por medio de instrucciones de comandos, utilizando Shell Script Batch.

Antes de nada, tenemos que entender la diferencia entre un proceso y un servicio, lo cual en muchos casos se tiende a confundir, refiriéndome de forma conceptual, pues ambos se ejecutan o corren, como un “proceso”.

Para ambos casos, un proceso y un servicio, es un programa que ejecuta un conjunto de instrucciones, que pueden correr en diferentes planos, tienen identificador de proceso y que pueden ejecutar procesos en cascada. Todo esto, así como en Windows, también se conoce de distintas maneras en GNU/Linux, así que, si estás considerando aprenderlo, te recomiendo el siguiente curso sobre Shell en Linux.

Diferencias entre un proceso y un servicio

  • Proceso:

    • Puede correr (estar en ejecución) tanto en primer como segundo plano.
    • Un proceso puede crear, ejecutar, detener y eliminar un servicio.
    • El proceso se puede matar (finalizar), no detener.
    • Tiene un tiempo de vida, hasta que finalice la ejecución del proceso.
  • Servicio:

    • Puede correr en segundo plano.
    • Un servicio también puede ejecutar procesos.
    • El servicio se puede iniciar, detener, reanudar y reiniciar, no matarlo.
      • Es posible eliminarlo, siempre que no esté en ejecución y por medio de línea de comandos.
    • Permanece en ejecución todo el tiempo, a menos que ocurra una corrupción por parte del sistema.

De forma gráfica, los procesos se ven de esta manera

  • Para acceder, clic derecho a la barra de tareas y seleccionar la opción “Administrador de tareas”.
  • También puedes ejecutar el programa Taskmgr.exe.
  • Una combinación de teclas que puedes usar para ejecutarlo, también es: CTRL + SHIFT + ESC.

Algunas características que podemos señalar, es que, así como se puede correr un proceso o visualizar como “uno solo”, como es el caso de Slack en la imagen, también un proceso puede derivar en otros, para ello, dando mayor uso a los núcleos del procesador, asimismo, manejando hilos, esto se ve usualmente en los navegadores, por ejemplo, los que ve en la imagen, Google Chrome y Mozilla Firefox. Estos hilos vienen dados porque el usuario ha abierto una nueva pestaña y cada proceso se aísla como uno solo, pero que pertenece al grupo del proceso principal.

¿Qué podemos monitorizar en los procesos?

  • Verificar el tipo de proceso, donde estos pueden ser, de aplicación, de Windows y proceso en segundo plano. El de aplicación es el proceso principal, el de Windows es de los programas que vienen nativo en el sistema y el proceso en segundo plano son los hilos de los procesos o bien, los subprocesos que se pueden desplegar.

  • El estado, donde se podrá verificar si se encuentra bien o no (Usualmente veríamos en ordenadores no tan sofisticados, que los programas digan “El programa no responde”).

  • Verificar el consumo de CPU, Memoria, Disco, GPU, Red, Consumo de energía y muchos otros atributos.

La línea de comandos, que es donde inspeccionas cómo fue llamado el proceso y con qué parámetros.


Observa como en dependencia también del tipo de proceso, son llamados y cómo se le pasan parámetros. Nótese que para los de tipo “Aplicación” se ejecuta el comando svchost.

De forma gráfica, los servicios se ven de esta manera

Seguimos obteniendo datos desde el programa Taskmgr.exe, sin embargo, esta vez, desde la pestaña “Servicios”.


La descripción que podemos encontrar son:

  • Nombre del servicio.
  • PID (Process ID), este es un identificador de proceso relacionado a un servicio.
  • Descripción sobre qué o quién es el fabricante del servicio.
  • El estado en que se encuentra el servicio. Antes habíamos visto la diferencia en cuanto a un proceso y es que este se puede, detener, reanudar o reiniciar, por lo tanto, el estado me mostrará si está En ejecución o Detenido.
  • El grupo al que pertenece.

Por supuesto, en cuanto a los servicios, no es el único lugar donde ver información e incluso, configurar los servicios. La central se encuentra llegando por medio del comando services.msc y se torna de la siguiente manera:


Desde este punto, se puede ver más información, como el tipo de inicio y el inicio de sesión. En adición, puedes ver las propiedades sobre cada servicio.

Implementando procesos

Ahora sí, se viene la parte práctica y que me parece, debe estar expuesta, por eso te he traído desde ejemplos sencillos hasta algo más complejos. Es el momento de tocar la línea de comandos y comenzar a tirar instrucciones.

Los comandos que vamos a utilizar son los siguientes:

  • tasklist (Esta herramienta muestra una lista de procesos que se están ejecutando en un equipo local o remoto)
  • WMIC (Interfaz de comandos para la gestión de Windows)
  • qprocess (Muestra información sobre procesos)
  • query (Muestra información sobre procesos, sesiones y servidores de host de sesión de escritorio remoto)
    • process
    • session
    • termserver
    • user
  • taskkill (Esta herramienta se usa para terminar tareas mediante el Id. de proceso (PID) o nombre de imagen)
  • tskill (Termina un proceso)

Puede que llegue un momento que, entre tanto comando, pierdas el hilo por no conocer alguno que otro, así que, si te interesa antes, conocer sobre Shell Scripting, te dejo un artículo que escribí sobre Shell Scripting en sistemas Windows.

Listando procesos

La monitorización de un equipo es importante, puesto que sirve para detectar incidencias, partiendo de un conjunto de datos, bien pueden ser datos de estado de servicios, de los mismos procesos que se están corriendo, de logs, etc.

Listar y aplicar filtros:

La forma más básica de listar los procesos que están corriendo en el sistema es ejecutando el comando: tasklist.

La salida de este, generará 5 columnas:

  • Nombre de la imagen
  • PID
  • Nombre de sesión
  • Núm. de sesión
  • Uso de memoria

Todos estos comandos son ejecutados desde la CLI (Interfaz de línea de comandos).

Exportar CSV de datos, de aquellos procesos cuyo PID contiene el valor 264.

tasklist.exe /v  | find /i "264"

También es posible utilizar filtros más avanzados, como condicionales, para señalar que debe imprimir por pantalla todo aquel proceso donde el uso de su memoria es mayor a 15000 y menor de 19000, por lo que, todo proceso que esté comprendido en ese rango, será mostrado.

tasklist /fi "memusage gt 15000"    /fi "memusage lt 19000"

Cada proceso tiene un nombre de imagen del proceso, por lo que también se puede aplicar un filtro por medio de este y es de la siguiente forma:

  • En este ejemplo se busca listar los procesos cuya imagen sea firefox.exe.
tasklist.exe /v /fi "IMAGENAME eq firefox.exe"

Por supuesto, no podía faltar, el cómo combinar filtros, que esto ya es má de la consola de Windows, que permite, luego de ejecutar una instrucción, ejecutar otra por medio de &.

  • En este ejemplo se busca listar todos aquellos procesos cuya imagen sea notepad.exe y firefox.exe.
tasklist /FI "IMAGENAME eq notepad.exe" & tasklist /FI "IMAGENAME eq firefox.exe"

Extraer todos los procesos con un ID de proceso superior a 1000 y mostrarlas en formato csv:

  • El fichero .csv es un fichero que puedes abrir con Excel o bien, leído por medio de algún algoritmo, como si se tratase de un JSON, solo que separados por comas.
  • Se usa el parámetro fo que significa Format Output o bien, formato de salida.
tasklist /v /fi "PID gt 1000" /fo csv

La información generada en formato csv, también es posible redirigirla a un fichero correspondiente a ese formato, ya si se desea abrirlo más tarde con algún software que provea hoja de cálculo, para ello, ejecutar la siguiente instrucción:

tasklist /v /fi "PID gt 1000" /fo csv > file.csv

Para enumerar los procesos del sistema que se están ejecutando actualmente, escriba:

tasklist /fi "USERNAME ne NT AUTHORITY\SYSTEM" /fi "STATUS eq running"

Para enumerar información detallada para todos los procesos que se están ejecutando actualmente, escriba:

tasklist /v /fi "STATUS eq running"

Para enumerar toda la información de servicio para los procesos en el equipo remoto srvmain, que tiene un nombre DLL que comienza con ntdll, escriba:

tasklist /s srvmain /svc /fi "MODULES eq ntdll*"

Para enumerar los procesos en el equipo remoto srvmain, utilizando las credenciales de su cuenta de usuario que ha iniciado sesión actualmente, escriba:

tasklist /s srvmain

Para enumerar los procesos en el equipo remoto srvmain, utilizando las credenciales de la cuenta de usuario Hiropln, escriba:

tasklist /s srvmain /u maindom\hiropln /p p@ssW23

Otra manera de listar los procesos, es con el comando WMIC:

  • Obtenemos información y mejor aún, la dirigimos a un fichero procs.txt.
WMIC /OUTPUT:C:\procs.txt PROCESS get Caption,Commandline,Processid

El comando qprocess y query son los mismos, tienen el mismo funcionamiento, por lo tanto, usar cualquiera de los dos para obtener información sobre servicios.

Puede utilizar este comando para averiguar qué programas está ejecutando un usuario específico y también qué usuarios están ejecutando un programa específico. Este comando devuelve la siguiente información:

  • Usuario propietario del proceso
  • Sesión propietaria del proceso
  • ID de la sesión
  • Nombre del proceso
  • ID del proceso

Para mostrar información sobre los procesos que utilizan todas las sesiones, escriba:

query process *

Para mostrar información sobre los procesos que utiliza la ID de sesión 1 , escriba:

query process /ID:1

Hasta este punto, está más que comprobado que con distintas maneras, podemos extraer información sobre los procesos, además de volcar los datos en un fichero.

Finalizando procesos

Finaliza una o más tareas o procesos. Los procesos se pueden finalizar por ID de proceso o nombre de imagen. Puede usar el comando tasklist para listar los procesos y determinar el ID de proceso (PID) para que el proceso finalice.

La sintaxis se presenta de esta manera:

taskkill [/s <computer> [/u [<domain>\]<username> [/p [<password>]]]] {[/fi <filter>] [...] [/pid <processID> | /im <imagename>]} [/f] [/t]

La forma más sencilla de matar o finalizar un proceso es por medio del identificador de proceso (PID), donde esto se consigue listando con el comando tasklist. Dentro de la misma instrucción, también puedes finalizar más de un proceso, para ello, repitiendo el flag /pid asociado al PID.

La forma más básica de matar un proceso es por medio de su PID:

taskkill /pid 1230

Si lo que deseas es poder finalizar 2 o más procesos en una misma instrucción, lo puedes lograr repitiendo el flag /pid y colocando el identificador de proceso.

taskkill /pid 1230 /pid 1241 /pid 1253

De la misma manera en que un ejercicio anterior, sobre listar los procesos con PID mayor a 1000, también se puede aplicar para matar procesos, haciendo lo siguiente:

taskkill /f /fi "PID ge 1000" /im *

Matar cuyos procesos no estén respondiendo y aquellos que tengan por título de ventana “WhatsApp”

taskkill /F /FI "STATUS eq NOT RESPONDING" /FI "WINDOWTITLE ne WhatsApp"

Este comando, también tiene funcionalidades para enviar señales a hosts remotos, indicando el nombre del servidor, nombre de dominio y las credenciales de acceso como usuario y contraseña; lo demás, sería la misma idea, pasarle por parámetros el nombre de la imagen o el PID a matar en la máquina remota y listo.

En el siguiente ejemplo, te muestro el modo de conexión, además, de la solicitud de matar los procesos cuyo nombre empiecen con “note”, de este modo, conseguirá encontrar el notepad.exe, notepad++ y otros procesos que existan en el equipo corriendo con ese inicio de nombre.

taskkill /s srvmain /u hostname\username /p p@ssW23 /fi "IMAGENAME eq note*" /im *

Como último comando para matar un proceso en el sistema, es el tskill.

Puede usar este comando para finalizar solo aquellos procesos que le pertenecen, a menos que sea un administrador. Los administradores tienen acceso completo a todas las funciones de tskill y pueden finalizar los procesos que se están ejecutando en otras sesiones de usuario.

Para finalizar el proceso 6543, escriba:

tskill 1230

Para finalizar el explorador de procesos que se ejecuta en la sesión 1, escriba:

tskill explorer /id:1

Estas fueron algunas de las formas de matar procesos desde línea de comandos utilizando los comandos taskkill y tskill.

Si quieres ir al siguiente nivel y aplicar temas de automatización, te recomiendo pasarte por el artículo que escribí sobre automatización de procesos con Shell Script Batch.

Implementando servicios

El comando a implementar es el siguiente:

  • sc (es un programa de línea de comandos usado para comunicarse con el Administrador de control de servicios y con los servicios).

Esta instrucción tiene muchos usos para poder administrar los servicios, así como consultar su estado, iniciar, detener, interrumpir, e incluso, eliminar de la consola.

  • query: Obtiene y muestra información sobre el servicio, el controlador, el tipo de servicio o el tipo de controlador especificados.
  • start: Inicia un servicio
  • stop: Detiene un servicio
  • pause: Pausa un servicio
  • delete: Elimina un servicio del registro de Services
  • create: Crea un servicio del registro
  • description: Cambia la descripción de un servicio.

Creando un servicio e iniciarlo

Crear un servicio con nombre “NuevoServicio” que mande a ejecutar el programa “NuevoServicio.exe’ y que este tenga un arranque automático:

sc create NuevoServicio binpath= c:\windows\system32\NuevoServicio.exe start= auto

Para hacer esto mismo, pero en un host remoto, escribir el servidor de la siguiente manera:

sc create \\miservidor NuevoServicio binpath= c:\windows\system32\NuevoServicio.exe start= auto

Para iniciar un servicio, basta con ejecutar la siguiente instrucción:

sc start NuevoServicio

Listar servicios

Para mostrar información solo para los servicios activos:

sc query 
sc query class= service

Mostrar información de todos los servicios, tanto activos como inactivos:

sc query state= all

Mostrar información sobre un servicio en específico:

sc query NuevoServicio

Para mostrar información de servicios interactivos, escriba:

sc query class= service class= interact

Eliminar servicios

Esta sección es la más sencilla, pues se hace aplicando el parámetro delete seguido del nombre del servicio, de la siguiente manera:

sc delete NuevoServicio

De esta manera, finiquitamos el modo de uso del comando sc.

Conclusión

Es importante conocer las diferencias entre un proceso y un servicio, lo cual, con éxito lo hemos tratado, además de abordar la implementación de cada uno, extendiendo por medio del uso de distintos comandos de la terminal de Windows, de estos comandos nativos, para que tengas la mayor cantidad de utilidades sin recurrir a terceros. Se ha abordado desde cómo listar procesos hasta cómo eliminarlos, asimismo para los servicios, desde cómo crearlos, hasta cómo eliminarlos.

Hasta este punto te digo ¡Felicidades! pues has logrado conocer una serie de instrucciones que te ayudarán a seguir tu camino como administrador de tus sistemas y los de otros de una manera profesional.

Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información