martes, 18 de agosto de 2015

Controlar el tiempo que lleva una aplicación activa con Powershell

Powershell

http://rlbisbe.net/2013/01/31/controlar-el-tiempo-que-lleva-una-aplicacion-activa-con-powershell/



Powershell es una herramienta muy versátil para desarrolladores y administradores de sistema, ya que, al igual que la shell de unix, permite automatizar tareas repetitivas con facilidad. Una de estas tareas puede ser controlar un proceso, aplicación o programa, cuanto tiempo lleva activo, y el uso de recursos que está haciendo.
En este artículo se verá cómo obtener el tiempo de un proceso en Powershell, el uso de CPU y RAM, así como enviar un e-mail con esa información de manera periódica.

Obteniendo la información del programa

Powershell recopila toda la información posible de un programa en el comando:
Get-Process Nombre_del_ejecutable (por ejemplo iexplore)
Este comando devuelve toda la información del mismo, desde la fecha de inicio, hasta los consumos actuales de CPU o RAM.
El tiempo total de la aplicacion se puede obtener de la siguiente manera:
(get-date).Subtract((Get-Process proceso).starttime)
Este comando obtiene el proceso, extrae la hora de inicio del mismo, y la resta a la hora actual del sistema. De este objeto, a su vez, se puede obtener el dato en horas, minutos y segundos.
Estos comandos se pueden agrupar mediante el uso de variables, de tal manera que sea más legible:
$proceso = Get-Process proceso
$tiempo = (get-date).Subtract($proceso.starttime)
$minutos = $tiempo.Minutes
El valor del uso de CPU se puede obtener directamente del campo proceso:
$cpu = $proceso.cpu
En el caso del uso de RAM, el proceso es similar, devolviendo el mismo en bytes. Para obtener el valor en otra escala es tan sencillo como dividirla por la unidad, en el caso del ejemplo, 1MB.
$ram = $proceso.ws / 1MB
Campos adicionales: Fecha y nombre DNS
La fecha y hora actuales se obtienen con el siguiente comando, que ya se ha usado anteriormente para obtener el tiempo de proceso:
get-date
Powershell, además de sus propios comandos, puede hacer uso de funciones de .net, como la usada anteriormente para obtener el hostname:
[System.Net.Dns]::GetHostName()

Enviar el e-mail

Para el envío de e-mail, lo primero es dar formato a toda la información que se ha obtenido anteriormente:
$memory = $process.ws / 1MB
$cpu = $process.cpu
$minutes = (get-date).Subtract($process.starttime).Minutes
$Body = "El programa ha estado ejecutando {0} minutos with con las estadisticas siguientes: `r`nCPU: {1:0.0}%`r`nMemoria: {2:0.0}MB" -f $program, $memory, $cpu, $memory
Esta manera de establecer las variables es muy similar a la que se emplea en .net con la llamada a String.Format().
Finalmente se inicializa el cliente SMTP con el que se enviará el e-mail, usando las credenciales de las que se disponga:
$EmailFrom = "status@servidor.com"
$EmailTo = "responsable@miempresa.com"
$Subject = "Estado del proceso"
$SMTPServer = "#servidor" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("#usuario", "#password");
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
Este proceso se ejecutará una vez, así que para conseguir que se mantenga continuamente en ejecución se necesita un bucle infinito y una espera. El bucle infinito se puede conseguir encerrando todo el código visto anteriormente en el siguiente:
for(;;){
   #Codigo de la aplicación
}
La espera se realiza mediante la función Start-Sleep que recibe el parámetro en segundos, de tal manera que para 30 minutos harían falta 1800 como parámetro.

Resumen

En este artículo se ha visto cómo mediante Powershell se puede gestionar un proceso en ejecución:
  • Obteniendo información de su uso actual de CPU y RAM
  • Calculando el tiempo de ejecución a partir de su hora de inicio y la hora actual.
  • Dando formato a la información para ser enviada (o guardada).
  • Enviando la información vía e-mail
  • Finalmente, quedándose a la espera durante 30 minutos para repetir la operación.