Algo de Linux: mayo 2017

miércoles, 31 de mayo de 2017

Ejecutar script de Powershell desde la consola de Windows

Podemos ejecutar un script de PowerShell directamente desde la consola de windows (cmd) de la siguiente manera:
C:\WINDOWS\system32> powershell -File windowsupdate.ps1
Donde windowsupdate.ps1 es el script de powershell que queremos ejecutar.

Es importante destacar que, por seguridad, la ejecución de scripts se encuentra deshabilitada por defecto, para evitar ejecutar accidentalmente código malicioso en nuestro sistema. No obstante, Windows permite establecer tres posibles políticas de ejecución de scripts:
  • AllSigned.
  • RemoteSigned.
  • Unrestricted.
La directiva AllSigned requiere que todos los scripts y archivos de configuración estén firmados por un editor de confianza, incluidos los scripts que se escriban en el equipo local. 

La directiva RemoteSigned requiere que todos los scripts y archivos de configuración descargados de Internet estén firmados por un editor de confianza, pero no requiere firmas digitales en scripts ejecutados desde el equipo local.

En cuanto a la directiva Unrestricted, permite ejecutar todos los scripts sin necesidad de que hayan sido firmados por un editor de confianza. 
Para consultar qué política se encuentra establecida en nuestro equipo en un momento determinado, podemos ejecutar:
C:\WINDOWS\system32> powershell Get-ExecutionPolicy
AllSigned
Y para establecer una política, por ejemplo, RemoteSigned:
C:\WINDOWS\system32> powershell Set-ExecutionPolicy RemoteSigned
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 30 de mayo de 2017

GPO: Eliminar perfiles de usuario con una antigüedad superior al número de días especificado al reiniciar el sistema

Podemos utilizar la directiva "Eliminar perfiles de usuario con una antigüedad superior al número de días especificado al reiniciar el sistema" para hacer limpieza en Windows eliminando perfiles de usuario locales que no se hayan usado durante un número determinado de días. Esta directiva se encuentra accesible en:

Configuración del equipo -> Directivas -> Plantillas administrativas -> Sistema -> Perfiles de usuario -> Eliminar perfiles de usuario con una antigüedad superior al número de días especificado al reiniciar el sistema

Una vez seleccionada la directiva, la habilitamos y especificamos el número de días de antigüedad:

Publicado por primera vez en http://enavas.blogspot.com.es

Instalar OpenSSH en Windows mediante Chocolatey

Para los que trabajamos habitualmente en Linux, es importante disponer del servicio ssh en Windows porque nos va a permitir conectarnos a nuestros clientes del mismo modo que nos conectamos a los clientes Linux. Ésto es algo muy sencillo de conseguir si utilizáis chocolatey:
C:\Windows\System32> choco install openssh -params '"/SSHServerFeature"'
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 24 de mayo de 2017

Administrar extensiones de Gnome Shell en portablet Vexia

Todos los nuevos equipos de nuestros centros llevan montado Ubuntu Trusty con entorno de escritorio XFCE4, excepto los portablets Vexia, en los que instalaron Ubuntu Xenial con entorno de escritorio GNOME SHELL, motivado porque estos últimos dispositivos tienen pantalla táctil.

Los portablets Vexia tienen instaladas una serie de extensiones de Gnome Shell que modifican el comportamiento y la funcionalidad del escritorio. Pues bien, para instalar y gestionar estas extensiones, podemos instalar una extensión en Firefox y/o Google Chrome que permite la integración de GNOME SHELL con el repositorio de extensiones https://extensions.gnome.org/


Aquí podéis ver una imagen de la extensión instalada en Google Chrome:


Y en Firefox:

Publicado por primera vez en http://enavas.blogspot.com.es

martes, 23 de mayo de 2017

Obtener la clave de Windows OEM mediante Windows OEM Product Key Tool

Los nuevos equipos con Windows ya no traen una pegatina con la clave de instalación. En lugar de ésto, incorporan la clave en la BIOS o EFI. 

Para obtener la clave de instalación de un equipo Windows con licencia OEM, podemos utilizar la herramienta Windows OEM Product Key Tool.


Publicado por primera vez en http://enavas.blogspot.com.es

Quitar mensaje: Modo de Prueba | Windows 10

Es posible que en alguna ocasión hayáis visto el siguiente mensaje en la esquina inferior derecha de vuestro escritorio Windows:


Para eliminarlo, abrimos como administrador la herramientas de símbolo de sistema de Windows cmd y ejecutamos el siguiente comando: bcdedit -set TESTSIGNING OFF




Una vez hecho ésto, reiniciamos el equipo y listo.
Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 19 de mayo de 2017

Instalar paquetes mediante Chocolatey a través de un proxy de nuestra red

Como ya vimos en posts anteriores es muy sencillo instalar y mantener actualizada una gran cantidad de software en Windows mediante Chocolatey.


Para instalar un paquete en concreto, tan sólo tenemos que utilizar el comando choco install al que pasaremos el nombre del paquete:
C:\> choco install mls-software-openssh
Chocolatey detectará el proxy de nuestra red y lo usará para instalar los paquetes que le pidamos. Ahora bien, en un momento determinado, es posible que nos interese especificar otro proxy diferente del proxy por defecto. Por ejemplo:
C:\> choco install mls-software-openssh --proxy=recursos:3128
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 18 de mayo de 2017

WSUS Offline Update: Solucionar problema de timeout en script DoUpdate.cmd

En mi centro utilizo WSUS Offline Update para descargar las actualizaciones de Windows y Office e instalarlas de forma local, lo que reduce el tiempo de actualización  y el consumo de ancho de banda.

Para descargar las actualizaciones, se utiliza un script que se ejecuta una vez a la semana en el servidor de almacenamiento mediante cron.

Para actualizar los clientes se utiliza un script Doupdate.cmd que se encuentra en el directorio wsusoffline/client/cmd/.

Pues bien, actualizando clientes, observé que tanto al detener el servicio wuauserv, como al iniciarlo o esperar a que estuviera iniciado, siempre se alcanzaba el timeout, lo que retardaba la ejecución un tiempo extra de 180s + 60s.

Esta mañana me puse a ver el código y descubrí dónde estaba el problema: El script está pensado para obtener el estado del servicio filtrando por la palabra "STAT".  Ahora bien, como nuestro sistema se encuentra en español, esa condición no se produce y estaremos esperando hasta que se agote el tiempo definido en el script.
La forma más sencilla de solucionar el problema es cambiar la palabra "STAT" por "ESTADO".

Aquí tenéis la parte del script donde hay que realizar las modificaciones:
:WaitService
echo Waiting for service '%1' to reach state '%2' (timeout: %3s)...
echo %DATE% %TIME% - Info: Waiting for service '%1' to reach state '%2' (timeout: %3s)>>%UPDATE_LOGFILE%
echo WScript.Sleep(2000)>"%TEMP%\Sleep2Seconds.vbs"
for /L %%i in (2,2,%3) do (
  for /F "tokens=4" %%j in ('%SystemRoot%\System32\sc.exe query %1 2^>nul ^| %SystemRoot%\System32\find.exe /I "STAT"') do (
    if /i "%%j"=="%2" (
      echo %DATE% %TIME% - Info: Service '%1' reached state '%2'>>%UPDATE_LOGFILE%
      del "%TEMP%\Sleep2Seconds.vbs"
      goto :eof
    )
  )
  %CSCRIPT_PATH% //Nologo //B //E:vbs "%TEMP%\Sleep2Seconds.vbs"
) 
echo Warning: Service '%1' did not reach state '%2' (timeout occured)
echo %DATE% %TIME% - Warning: Service '%1' did not reach state '%2' (timeout occured)>>%UPDATE_LOGFILE%
del "%TEMP%\Sleep2Seconds.vbs"
verify other 2>nul
goto :eof


:StopWUSvc
for /F "tokens=4" %%i in ('%SystemRoot%\System32\sc.exe query wuauserv 2^>nul ^| %SystemRoot%\System32\find.exe /I "STAT"') do (
  if /i "%%i"=="STOPPED" goto :eof
)
echo Stopping service 'Windows Update' (wuauserv)...
echo %DATE% %TIME% - Info: Stopping service 'Windows Update' (wuauserv)>>%UPDATE_LOGFILE%
%SC_PATH% stop wuauserv >nul 2>&1
if errorlevel 1 (
  echo Warning: Stopping of service 'Windows Update' ^(wuauserv^) failed.
  echo %DATE% %TIME% - Warning: Stopping of service 'Windows Update' ^(wuauserv^) failed>>%UPDATE_LOGFILE%
) else (
  call :WaitService wuauserv STOPPED 30
  if not errorlevel 1 echo %DATE% %TIME% - Info: Stopped service 'Windows Update' ^(wuauserv^)>>%UPDATE_LOGFILE%
)
goto :eof


:StartWUSvc
for /F "tokens=4" %%i in ('%SystemRoot%\System32\sc.exe query wuauserv 2^>nul ^| %SystemRoot%\System32\find.exe /I "STAT"') do (
  if /i "%%i"=="RUNNING" goto :eof
)
echo Starting service 'Windows Update' (wuauserv)...
echo %DATE% %TIME% - Info: Starting service 'Windows Update' (wuauserv)>>%UPDATE_LOGFILE%
%SC_PATH% start wuauserv >nul 2>&1
if errorlevel 1 (
  echo Warning: Starting of service 'Windows Update' ^(wuauserv^) failed.
  echo %DATE% %TIME% - Warning: Starting of service 'Windows Update' ^(wuauserv^) failed>>%UPDATE_LOGFILE%
) else (
  call :WaitService wuauserv RUNNING 30
  if not errorlevel 1 echo %DATE% %TIME% - Info: Started service 'Windows Update' ^(wuauserv^)>>%UPDATE_LOGFILE%
)
goto :eof
Y aquí tenéis esa parte del script en la que he cambiado la palabra "STAT" por "ESTADO":

:WaitService
echo Waiting for service '%1' to reach state '%2' (timeout: %3s)...
echo %DATE% %TIME% - Info: Waiting for service '%1' to reach state '%2' (timeout: %3s)>>%UPDATE_LOGFILE%
echo WScript.Sleep(2000)>"%TEMP%\Sleep2Seconds.vbs"
for /L %%i in (2,2,%3) do (
  for /F "tokens=4" %%j in ('%SystemRoot%\System32\sc.exe query %1 2^>nul ^| %SystemRoot%\System32\find.exe /I "ESTADO"') do (
    if /i "%%j"=="%2" (
      echo %DATE% %TIME% - Info: Service '%1' reached state '%2'>>%UPDATE_LOGFILE%
      del "%TEMP%\Sleep2Seconds.vbs"
      goto :eof
    )
  )
  %CSCRIPT_PATH% //Nologo //B //E:vbs "%TEMP%\Sleep2Seconds.vbs"
) 
echo Warning: Service '%1' did not reach state '%2' (timeout occured)
echo %DATE% %TIME% - Warning: Service '%1' did not reach state '%2' (timeout occured)>>%UPDATE_LOGFILE%
del "%TEMP%\Sleep2Seconds.vbs"
verify other 2>nul
goto :eof


:StopWUSvc
for /F "tokens=4" %%i in ('%SystemRoot%\System32\sc.exe query wuauserv 2^>nul ^| %SystemRoot%\System32\find.exe /I "ESTADO"') do (
  if /i "%%i"=="STOPPED" goto :eof
)
echo Stopping service 'Windows Update' (wuauserv)...
echo %DATE% %TIME% - Info: Stopping service 'Windows Update' (wuauserv)>>%UPDATE_LOGFILE%
%SC_PATH% stop wuauserv >nul 2>&1
if errorlevel 1 (
  echo Warning: Stopping of service 'Windows Update' ^(wuauserv^) failed.
  echo %DATE% %TIME% - Warning: Stopping of service 'Windows Update' ^(wuauserv^) failed>>%UPDATE_LOGFILE%
) else (
  call :WaitService wuauserv STOPPED 30
  if not errorlevel 1 echo %DATE% %TIME% - Info: Stopped service 'Windows Update' ^(wuauserv^)>>%UPDATE_LOGFILE%
)
goto :eof


:StartWUSvc
for /F "tokens=4" %%i in ('%SystemRoot%\System32\sc.exe query wuauserv 2^>nul ^| %SystemRoot%\System32\find.exe /I "ESTADO"') do (
  if /i "%%i"=="RUNNING" goto :eof
)
echo Starting service 'Windows Update' (wuauserv)...
echo %DATE% %TIME% - Info: Starting service 'Windows Update' (wuauserv)>>%UPDATE_LOGFILE%
%SC_PATH% start wuauserv >nul 2>&1
if errorlevel 1 (
  echo Warning: Starting of service 'Windows Update' ^(wuauserv^) failed.
  echo %DATE% %TIME% - Warning: Starting of service 'Windows Update' ^(wuauserv^) failed>>%UPDATE_LOGFILE%
) else (
  call :WaitService wuauserv RUNNING 30
  if not errorlevel 1 echo %DATE% %TIME% - Info: Started service 'Windows Update' ^(wuauserv^)>>%UPDATE_LOGFILE%
)
goto :eof
Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 5 de mayo de 2017

Reparación de particiones NTFS en Linux

Algunos usuarios tienen las particiones de sus discos duros externos en formato NTFS  y, si una partición se ha desmontado mal en algún momento, es posible que se necesite ser reparada.

Para reparar particiones NTFS desde linux podemos utilizar en primera instancia la herramienta ntfsfix que vienen en el paquete ntfs-3g. Por ejemplo: Supongamos que estamos tratando de conectar un disco duro que nos está mostrando error al montarse y que tiene una única partición /dev/sdb1. Podríamos chequearlo mediante ntfsfix de la siguiente manera:
# ntfsfix /dev/sdb1
Publicado por primera vez en http://enavas.blogspot.com.es

ntfs-3g: Gestionar particiones NTFS desde Linux

ntfs-3g es una implementación open source del sistema de ficheros NTFS de Microsoft. Para poder trabajar con particiones ntfs en nuestro sistema Ubuntu/Debian, no tenemos más que instalar este paquete:
apt-get install ntfs-3g

Al instalar el paquete, tendremos a nuestra disposición, junto con el driver, una amplia colección de utilidades que nos permiten trabajar con particiones NTFS.

Veamos algunas de las utilidades que nos proporciona este paquete:
  • ntfsfix tal y como dice la ayuda, ntfsfix es una utilidad que arregla algunos problemas comunes en volumenes NTFS.
  • mkntfs nos permite formatear una partición con el sistema de archivos NTFS.
  • ntfsinfo nos permite ver informacion detallada de volumenes NTFS.
  • ntfslabel nos permite ver y cambiar la etiqueta de volumen de una particion NTFS.
  • ntfsresize nos permite redimensionar un volumen NTFS de forma no destructiva, moviendo de forma segura cualquier dato si es necesario.
  • ntfsundelete nos permite recuperar archivos eliminados de una particion NTFS.
  • ntfscluster identifica ficheros en una región específica de un volumen NTFS.
  • ntfscat muestra en pantalla ficheros de volumenes NTFS sin montar la particion.
  • ntfsls lista el contenido de directorios sin montar la particion.
  • ntfscp nos permite copiar ficheros en un volumen NTFS.
  • ntfsclone nos permite clonar volumenes NTFS o una parte de ellos.
Publicado por primera vez en http://enavas.blogspot.com.es

Controlar los clientes Ubuntu de Infolab con Epoptes

Para los que no lo conocen, Epoptes es una herramienta de control de aula GPL bastante sencilla de utilizar que funciona mediante un sistema cliente/servidor y que nos va a permitir:
  • Mostrar la pantalla en los clientes.
  • Supervisarlos.
  • Ejecutar comandos de forma remota.
  • Enviarles mensajes.
  • Aplicar restricciones como por ejemplo el bloqueo del terminal.
  • etc...
Es fácil de implantar. Tan sólo requiere instalar y configurar:
  • El paquete epoptes en el equipo del profesor.
  • El paquete epoptes-client en los equipos de alumnos.
Además, es sencillo de desplegar con un simple módulo puppet que instale y configure tanto el cliente como el servidor.

Para que el profesor pueda controlar el aula, tiene que estar en el grupo por defecto epoptes. No obstante, es posible cambiarlo en el fichero /etc/default/epoptes:
# The port where the server will be listening on, and where the client will try
# to connect to. For security reasons it defaults to a system port, 789.
#PORT=789

# Epoptes server will use the following group for the communications socket.
# That means that any user in that group will be able to launch the epoptes UI
# and control the clients.
#SOCKET_GROUP=epoptes
SOCKET_GROUP=teachers
En el directorio /etc/epoptes del equipo del profesor, donde hemos instalado el paquete epoptes, encontraréis dos ficheros que contienen la clave pública y la clave privada:
# ls -l /etc/epoptes/
total 8
-rw-r--r-- 1 root root 1919 abr 21 13:44 server.crt
-rw------- 1 root root 3272 abr 21 13:44 server.key
Podemos distribuir la clave pública del equipo del profesor (server.crt) a los clientes mediante el módulo puppet que creemos para configurarlo.

Por último, podemos crear un grupo de hosts para cada infolab y copiar la información de grupos a los profesores: $HOME/.config/epoptes/groups.json 

Una vez configurarlo, podremos, encender, apagar y controlar los equipos de alumnos:


Como podéis ver en la siguiente imagen, podemos controlar el equipo de alumno incluso antes de que inicie sesión:


Y veremos qué equipos están encendidos, cuáles se encuentran apagados y quién ha iniciado sesión en un determinado equipo:


Además, podemos conectarnos de forma remota mediante ssh exportando el display y controlaremos el aula desde nuestro equipo de administrador.
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 4 de mayo de 2017

Eliminar rutas por defecto cuando tenemos varias interfaces de red

Supongamos que tenemos un equipo con al menos dos interfaces de red... Por ejemplo:
# cat /etc/network/intefaces
auto lo eth0 eth1

iface lo inet loopback

iface eth0 inet dhcp

iface eth1 inet dhcp

Si queremos garantizar que la ruta por defecto sea la de la interfaz eth0, podemos eliminar la ruta por defecto de la interfaz eth1 simplemente añadiendo la línea que he resaltado en color amarillo y que se encarga de eliminarla:
auto lo eth0 eth1

iface lo inet loopback

iface eth0 inet dhcp

iface eth1 inet dhcp
      post-up route del default dev $IFACE
Publicado por primera vez en http://enavas.blogspot.com.es

CUPS Cloud Print: Nueva versión del paquete

Como ya vimos en un post de septiembre de 2015, el paquete cupscloudprint nos permite utilizar impresoras de Google Cloud Print como impresoras locales en nuestro equipo.
El paquete que instalábamos en ese post no funcionaba en versiones más actuales del sistema operativo, por lo que el autor del paquete publicó una nueva versión corrigiendo los problemas. Si queréis, podéis descargarlo con wget:
# wget http://ppa.launchpad.net/simon-cadman/niftyrepo/ubuntu/pool/main/c/cupscloudprint/cupscloudprint_20160502-1_all.deb
E instalarlo directamente:
# dpkg -i cupscloudprint_20160502-1_all.deb
Publicado por primera vez en http://enavas.blogspot.com.es

Warnings "W: Possible missing firmware /lib/firmware/rtl_nic/rtl8107e-2.fw for module r8169" en Debian

Si tenéis mensajes de warning del tipo: "W: Possible missing firmware /lib/firmware/rtl_nic/rtl8107e-2.fw for module r8169", lo más probable es que sea porque no tenéis instalado el firmware propietario de Realtek. Podéis instalar este firmware simplemente instalando el paquete firmware-realtek:
# apt-get install firmware-realtek
Publicado por primera vez en http://enavas.blogspot.com.es

Actualizar el kernel a la versión 4 en Debian Jessie

Para actualizar el kernel a la versión 4 en Debian Jessie, debemos utilizar los repositorios de Debian Backports:
# echo "deb http://ftp.debian.org/debian jessie-backports main contrib non-free" > /etc/apt/sources.list.d/jessie-backports.list
Una vez que tenemos el repositorio, actualizamos índices:
# apt-get update
Una vez actualizado, instalamos el kernel que nos interese. Por ejemplo: Suponiendo que tengo una máquina con un sistema de 32 bits en la que quiero instalar un kernel pae:
# apt-get -t jessie-backports install linux-image-686-pae linux-headers-686-pae
Publicado por primera vez en http://enavas.blogspot.com.es

Drivers de OpenPrinting para Epson WorkForce Pro WF-8590

Epson proporciona un driver GPL para la impresora A3 Epson WorkForce Pro WF-8590 que tenemos en los centros y que funciona perfectamente. Podéis ver más información en la página de OpenPrinting: http://www.openprinting.org/printer/Epson/Epson-WF-8590_Series
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 3 de mayo de 2017

Script desbloquearimpresoras

Para evitar el bloqueo permanente de impresoras, utilizo un script que se ejecuta de forma periódica mediante una tarea cron. Este script evita el bloqueo que se produce en determinadas situaciones.
# cat /usr/local/bin/desbloquearimpresoras
#!/bin/bash
# ------------------------------------------------------------
# script:  /usr/local/bin/desbloquearimpresoras
# Author:  Esteban M. Navas Martín
# Date:    27-04-2014
# Ver:     03-05-2017
#
# Purpose: Unlock printers and jobs

# Copyright (c) 2012-2017 Esteban M. Navas Martín . All rights reserved.
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.

#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#   You should have received a copy of the GNU General Public License
#   along with this program. If not, see .

idioma=$LC_ALL
export LC_ALL=en_US.UTF-8

# Definimos una antiguedad maxima de trabajos de 10 minutos
antiguedad=10

# Obtenemos la lista de impresoras
lpstat -s > /tmp/impresoras

#  Identificar impresoras locales y asegurar que esten operativas
while read linea; do
  impresora=`echo $linea | grep 'device' | awk '{print$3}' | cut -f1 -d":"`
  impresoradesconectada=`lpstat -o -p $impresora | grep Unplugged`
  impresorapausada=`lpstat -o -p $impresora | grep Paused`
  impresorarechazandojobs=`lpstat -o -p $impresora | grep Rejecting`

  if [ "$impresorarechazandojobs" ]; then
     cupsaccept $impresora
  fi

  if [ "$impresorapausada" ]; then
     cupsenable $impresora
  fi

done < /tmp/impresoras

# Obtenemos el estado de los trabajos de las impresoras
lpstat -o | awk '{print$1,$5,$6,$7,$8}'>/tmp/trabajosimpresora

# Procesamos cada trabajo
while read trabajo; do
  impresora=`echo ${trabajo%-*}`
  numtrabajo=`echo ${trabajo##*-} | cut -f1 -d" "`
  fechatrabajo=$(date -d "`echo $trabajo | awk '{print$6,$7,$8}'`" "+%s")
  fechaactual=`date +%s`
  diferencia=$(((fechaactual-fechatrabajo) / 60))
  impresoradesconectada=`lpstat -o -p $impresora | grep Unplugged`

  if [ ! $impresoradesconectada ]; then
     if [ $diferencia -gt $antiguedad ]; then
        cancel $numtrabajo
     fi
  fi

done < /tmp/trabajosimpresora

export LC_ALL=$idioma
Publicado por primera vez en http://enavas.blogspot.com.es

Script limpiarspoolimpresora

Para limpiar el spool de las impresoras, tengo puesto un script muy simple en los clientes que para el servicio, borra el directorio de spool de cups y vuelve a iniciar el servicio:
# cat /usr/local/sbin/limpiarspoolimpresora
#!/bin/bash
service cups stop
rm -r /var/spool/cups/*
service cups start
De este modo, puedo limpiar el spool cuando sea necesario. Publicado por primera vez en http://enavas.blogspot.com.es

Ejecutar un comando en bash con unos locales específicos

En ocasiones nos interesa ejecutar un comando con unos locales específicos. Ésto es algo sencillo de lograr:
LC_ALL=en_US.utf8 lpstat -p
En el ejemplo anterior estamos haciendo que el comando lpstat -p nos muestre la salida del comando en inglés. Publicado por primera vez en http://enavas.blogspot.com.es

martes, 2 de mayo de 2017

systemctl: Gestión de servicios systemd

Systemd es el sistema de inicio que incorpora Debian Jessie, y que, por tanto, tenemos en nuestros servidores. Destaco que es el sistema de nuestros servidores porque nuestros clientes tienen montado Ubuntu Trusty, que utiliza Upstart; si bien es cierto, que cuando pasemos los clientes a Xenial, se homogeinizará un poco el tema puesto que Ubuntu Xenial usa también Systemd. Mientras tanto, debemos tener en cuenta este detalle.

En este post vamos a ver cómo gestionamos servicios en systemd mediante la herramienta systemctl, algo que he notado que muchos compañeros no tiene claro.

En systemd, los servicios se nombran siempre con el sufijo .service

La sintaxis de systemctl a la hora de trabajar con servicios es muy sencilla:
# systemctl acción servicio.service

Donde:
  • acción será la operación a realizar con el servicio.
    • start
    • stop
    • restart
    • reload
    • reload-or-restart
    • status
    • enable
    • disable
    • is-active
    • is-enabled
    • is-failed
  • servicio será el nombre del servicio.
De acuerdo con lo anterior, vamos a ver qué operaciones podemos realizar con un servicio, utilizando a modo de ejemplo, el servicio slapd:

Para iniciar por ejemplo el servicio slapd, ejecutaremos:
# systemctl start slapd.service
Si queréis, podéis omitir el sufijo service a la hora de ejecutar el comando:
# systemctl start slapd
Para parar el servicio slapd, ejecutaremos:
# systemctl stop slapd.service
Para reiniciar el servicio slapd, ejecutaremos:
# systemctl restart slapd.service
Si el servicio dispone de la opción reload, ejecutaremos:
# systemctl reload slapd.service
Si no sabemos si el servicio tiene la función reload, podemos usar la acción reload-or-restart que tratará de recargar la configuración, y, si no es posible, reiniciará el servicio para que la nueva configuración sea aplicada:
# systemctl reload-or-restart slapd.service
Para comprobar el estado del servicio slapd, ejecutaremos:
# systemctl status slapd.service
Notaréis que las líneas largas se cortan. Si queréis mostrar la información completa, tan sólo tenéis que utilizar el parámetro -l:
# systemctl status -l slapd.service
Otro ejemplo: Supongamos que queremos comprobar el estado del servicio pdns.service:
# systemctl status -l pdns.service 
● pdns.service - PowerDNS Authoritative Server
   Loaded: loaded (/lib/systemd/system/pdns.service; enabled)
   Active: active (running) since mar 2017-05-02 18:48:13 CEST; 9s ago
  Process: 21937 ExecStop=/usr/bin/pdns_control quit (code=exited, status=0/SUCCESS)
 Main PID: 21943 (pdns_server)
   CGroup: /system.slice/pdns.service
           ├─21943 /usr/sbin/pdns_server --daemon=no
           └─21947 /usr/sbin/pdns_server-instance --daemon=no

may 02 18:48:17 servidor pdns_server[21943]: May 02 18:48:17 Polled security status of version 3.4.1-4+deb8u7.Debian at startup, no known issues reported: OK
may 02 18:48:17 servidor pdns_server[21943]: May 02 18:48:17 Set effective group id to 119
may 02 18:48:17 servidor pdns[21947]: Set effective user id to 111
may 02 18:48:17 servidor pdns[21947]: DNS Proxy launched, local port 32566, remote 127.0.0.1:1553
may 02 18:48:17 servidor pdns[21947]: Creating backend connection for TCP
may 02 18:48:17 servidor pdns[21947]: [LdapBackend] LDAP servers = ldap://127.0.0.1 ldap://172.19.144.3
may 02 18:48:17 servidor pdns_server[21943]: May 02 18:48:17 Set effective user id to 111
may 02 18:48:17 servidor pdns_server[21943]: May 02 18:48:17 DNS Proxy launched, local port 32566, remote 127.0.0.1:1553
may 02 18:48:17 servidor pdns_server[21943]: May 02 18:48:17 Creating backend connection for TCP
may 02 18:48:17 servidor pdns_server[21943]: May 02 18:48:17 [LdapBackend] LDAP servers = ldap://127.0.0.1 ldap://172.19.144.3
Para activar un servicio que se encuentra desactivado, utilizamos la acción enable:
# systemctl enable slapd.service
Para desactivar un servicio, utilizamos la acción disable:
# systemctl disable slapd.service
Para comprobar si un servicio se encuentra activo:
# systemctl is-active slapd.service
Ahora bien, si lo que queremos es comprobar si un servicio se encuentra activado:
# systemctl is-enabled slapd.service
Del mismo modo, podemos comprobar si un servicio está fallando:
# systemctl is-failed slapd.service
Esta comprobación nos devolverá "active" si el servicio está corriendo perfectamente y "failed" si ocurrió algún error. Publicado por primera vez en http://enavas.blogspot.com.es