Shell Scripting en Sistemas Windows
Descubre qué es el Shell Scripting en Windows, cómo utilizarlo y todo lo necesario par comenzar a aprovechar todas las ventajas que...
Aprende de forma práctica a gestionar procesos y servicios que están corriendo y siendo lanzados a través de instrucciones de comandos Shell Script Batch.
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.
Proceso:
Servicio:
Taskmgr.exe
.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
.
Seguimos obteniendo datos desde el programa Taskmgr.exe
, sin embargo, esta vez, desde la pestaña “Servicios”.
La descripción que podemos encontrar son:
En ejecución
o Detenido
.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.
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)
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.
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:
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:
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 &
.
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:
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
:
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:
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.
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.
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 serviciostop
: Detiene un serviciopause
: Pausa un serviciodelete
: Elimina un servicio del registro de Servicescreate
: Crea un servicio del registrodescription
: Cambia la descripción de un servicio.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
Para mostrar información solo para los servicios activos:
sc query
sc query type= 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 type= service type= interact
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
.
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.
También te puede interesar
Descubre qué es el Shell Scripting en Windows, cómo utilizarlo y todo lo necesario par comenzar a aprovechar todas las ventajas que...
Descubre cómo utilizar Shell Script Batch para automatizar sistemas y aprovechar todas las ventajas que ofrece esta tecnología para ahorrar tiempo.
Aprende profesionalmente el uso de la shell en linux en tu día a día, conoce los comandos básicos,...