Demonio bash linux

Esquema de script muy sencillo para hacer un demonio en bash corriendo en background:

#!/bin/bash

# At first you have to redirect stdout and stderr to /dev/null
exec >/dev/null
exec 2>/dev/null

# Fork and go to background
(
while true; do
    echo 'hi' >> ~/hihihi
    sleep 10
done
)&
# Parent process finished but child still working


Visto en: http://stackoverflow.com/questions/41258219/how-to-daemonize-a-script

Resumen SYSTEMD

Conceptos fundamentales:

unit Definición de un proceso (unidad mínima)
target Agrupación de 'units' para manejar un servicio o varios
journal Sistema de logs de todas las operaciones y salidad de SYSTEMD

Comandos para gestión de servicios

systemctl status SERVICIO service SERVICIO status
systemctl start SERVICIO service SERVICIO start
systemctl stop SERVICIO service SERVICIO stop
systemctl reload SERVICIO service SERVICIO reload
systemctl restart SERVICIO service SERVICIO restart
systemctl enable SERVICIO chkconfig SERVICIO on
systemctl disable SERVICIO chkconfig SERVICIO off
systemctl is-active SERVICIO chkconfig SERVICIO
systemctl is-enabled SERVICIO chkconfig --list | grep SERVICIO
systemctl is-failed SERVICIO
systemctl list-units
systemctl list-units -all
systemctl list-units --all --state=inactive
systemctl linst-units --type=service
systemctl list-unit-files --type=service chkconfig --list
systemctl list-dependencies SERVICIO --after
systemctl list-dependencies SERVICIO --before

UNIT: Concepto de mínimo recurso que maneja "systemd".
Las UNIT se definen en archivos.

Tipo de UNITExtensión del ficheroDescription
Service unit .service Un servicio clásico
Target unit .target Grupo de units
Automount unit .automount Filesystem
Device unit .device Dispositivo (reconocido por el kernel)
Mount unit .mount Punto de montaje
Path unit .path Ruta
Scope unit .scope Proceso creado externamente a systemd
Slice unit .slice Conjunto jerárquico de units organizadas para manejar un grupo de procesos del sistema.
Snapshot unit .snapshot Un estado salvado de la configuración de systemd
Socket unit .socket Socket
Swap unit .swap Dispositivo o archivo swap
Timer unit .timer Cronómetro


Rutas
Path Descripción Prioridad
/run/systemd/system/ Creadas en tiempo de ejecución 1
/etc/systemd/system/ Enlazadas a /usr/lib/systemd/system al habilitar un servicio 2
/usr/lib/systemd/system/ Definiciones de Units con las que se instalan los paquetes (rpm) 3

Archivo Unit
Aspecto de un archivo de definición de 'Unit' (sshd.service):
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service    #Orden específico de arranque
Wants=sshd-keygen.service                            #Otra unit necesaria para este 

[Service]
Type=forking
PIDFile=/var/run/sshd.pid
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd $OPTIONS      #Comando de start
ExecReload=/bin/kill -HUP $MAINPID    #Comando de reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target      
             #Otra unit de la cual forma parte

Runlevels
Desaparece el concepto clásico. Se sustituyen por 'targets'.
Varios targets pueden estar activos a la vez si las dependencias lo permiten.

systemctl get-default Target por defecto
systemctl set-default graphical.target
Establecer target por defecto
systemctl list-units --type=target Targets activos
systemctl list-unit-files --type=target Targets disponibles
systemctl rescue|halt|poweroff|reboot shortcut a single-user|halt|apagar|reiniciar

Journal

journalctl Ver todos los logs desde el principio
journalctl -f Modo seguimiento. Ver en tiempo real
journal -u UNIDAD Ver logs de una unidad en particular


Referencias:

Uso de memoria RAM por proceso en Linux

La salida del clásico comando:
ps aux
...suele ser suficiente para ver el consumo de memoria de cada proceso.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  10644   708 ?        Ss   jun30   0:05 init [2] 
root         2  0.0  0.0      0     0 ?        S    jun30   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    jun30   0:14 [ksoftirqd/0]
root         6  0.0  0.0      0     0 ?        S    jun30   0:07 [migration/0]
[...]

USER: Propietario del proceso
PID: Identificador del proceso
%CPU: Relación de tiempo que el proceso usa CPU respecto al que está corriendo. Ojo, no es sobre el total del sistema.
%MEM: Relación de memoria (no swapeada) que el proceso usa respecto al total del sistema.
VSZ: Memoria virtual usada por el proceso completo.
RSS: Resident Set Size. Memoria no swapeada usada por el proceso.
TTY: Terminal asociado.
STAT: Estado del proceso.
START: Fecha de inicio del proceso.
TIME: Total de CPU usado desde que se inició.
COMMAND: Comando que lanzó el proceso.

Buceando por Internet he encontrado algunas filigranas dignas de mención y enormemente útiles para obtener la misma información:

  • Ordenado por orden de consumo:
ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

  • Human readable:
 ps -eo size,pid,user,command | sort -rn | awk '{ hr[1024^2]="GB"; hr[1024]="MB"; for (x=1024^3; x>=1024; x/=1024) { if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break } } } { printf ("%-6s %-10s ", $2, $3) } { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }'
  • Un script python fantástico
 Private  +   Shared  =  RAM used    Program

 80.0 KiB +  22.5 KiB = 102.5 KiB    init
116.0 KiB +  12.5 KiB = 128.5 KiB    minissdpd
116.0 KiB +  14.5 KiB = 130.5 KiB    chrome-sandbox
148.0 KiB +  20.5 KiB = 168.5 KiB    in.tftpd
[...]
101.6 MiB + 734.5 KiB = 102.3 MiB    nxserver.bin (2)
111.0 MiB +   1.4 MiB = 112.5 MiB    remmina
118.9 MiB +   6.1 MiB = 125.0 MiB    Xorg
134.9 MiB +  21.0 MiB = 155.9 MiB    chrome (5)
199.1 MiB +   3.7 MiB = 202.9 MiB    thunderbird
468.7 MiB +   5.5 MiB = 474.3 MiB    firefox
---------------------------------
                          1.7 GiB
=================================

¿Quien está consumiendo SWAP?

Excelente linea de comando para saber que procesos están ocupando SWAP y cuanto:


 for i in $( ls -d /proc/[0-9]* ) ; do SWAP=$(egrep --color '^VmSwap:[[:space:]]*[^0 ][0-9]* kB' "$i/status" 2>/dev/null ) && { cat "$i/cmdline" ; echo -n " (" $( basename $i ) ; echo -n "): " ; echo $( echo $SWAP | tr -s ' ' | cut -d' ' -f2- ) ; } ; done | sort -t':' -k2 -n

Nota: Este código no es mio. Lo encontré en Internet hace tiempo y tomé nota. Si eres la fuente original, por favor pásame el enlace para referenciarlo. Gracias.

Comandos útiles para "Space Reclaim"

Especialmente si se utilizan volúmenes de almacenamiento en SAN que están siendo ofrecidos en formato thin, es muy habitual que las salidas de comandos df no coincidan con los espacios en uso reportados por los propios sistemas SAN.
Esto se debe a que la mayoría de sistemas operativos no ejecutan la función unmap o trim cuando eliminan un archivo (conjunto de bloques en general), por lo que la SAN no es consciente de que ese espacio vuelve a estar libre.

Algunos sistemas de ficheros como Ext4 lo hacen automáticamente si se montan con la opción discard, pero no es lo habitual.

En casi todos los sistemas lo que sí existe es alguna forma de hacer un barrido al sistema de archivos para que ejecute las llamadas unmap sobre todos los bloques liberados para que la SAN se de por enterada. Son los siguientes:

Linux
#> fstrim /mountpoint

Vmware ESXi (>5)
#> cd /vmfs/volumes/DATASTORENAME
#> vmkfstool -y 60

El parámetro 60 hace referencia al porcentaje de espacio libre que se va a intentar reclamar. Este puede/debe ser ajustado de forma manual, pero 60 es un buen valor para comenzar y así lo recomienda VMWare.

Referencias:

http://linoxide.com/file-system/linux-reclaim-storage-space-ext4-unmap-feature/

Gestión de hora en dominio windows


Escenario

Un servidor de hora fiable dentro de una organización o acceso a uno (vg.- hora.roa.es).
Controladores de dominio de windows deben tomar la hora de este servidor de hora para servidrla a través del PDC al resto de servidores y PCs Windows (esto es automático).

Comandos


Comprobar de donde toma la hora un "Domain Controller":
w32tm /query /configuration

Forzar una resincronización
w32tm /resync

Añadir el servidor externo como proveedor de hora:
w32tm /config /syncfromflags:manual /manualpeerlist: hora.roa.es
w32tm /config /update

Recomendación

Hacer que todos los controladores de dominio de la organización tengan las mismas fuentes de hora.

Delegar control total de una OU en OpenLDAP a un usuario

"OU" a delegar:

 ou=clientes,ou=People,dc=test,dc=com

Creación del usuario:

 Este es el ldif del nuevo usuario creado en la raíz del árbol:

cn=subadmin,dc=test,dc=com
dn: cn=subadmin,dc=test,dc=com
cn: subadmin
objectclass: simpleSecurityObject
objectclass: organizationalRole
objectclass: top
userpassword: {SSHA}k2eAXwOOKhrYR4aUadKCU6syRS3e6CqQ

ACL de escritura:

Aquí es donde se produce la magia. Editando el archivo "slapd.conf" se introduce la ACL que otorga los permisos:

[...]
access to dn.children="ou=clientes,ou=People,dc=test,dc=com"
         by dn.base="cn=subadmin,dc=test,dc=com" write
[...]

 Reinicar el servicio slapd. 

#> /etc/init.d/slapd restart

Prueba

El usuario nuevo debería ser capaz de conectarse y crear/borrar/modificar objetos por debajo de la "OU" delegada.