Comandos Linux Basicos para gestion de PID

Lo que deberías recordar de los comandos de Linux para gestionar procesos

  • El comando ps es una herramienta clave para listar y obtener información detallada sobre los procesos en ejecución.
  • top y htop permiten monitorear procesos en tiempo real, con htop ofreciendo una interfaz más amigable y visual.
  • Usa pgrep para buscar rápidamente procesos por su nombre.
  • Para finalizar procesos, killpkill y killall son opciones efectivas, siendo kill para finalizar por PID, y pkill y killall para eliminar por nombre o en masa.
  • fg y bg son útiles para gestionar procesos en segundo o primer plano.
  • El comando nohup es esencial para ejecutar procesos que continúen corriendo aunque el terminal se cierre.
  • nice y renice te permiten ajustar las prioridades de procesos, para optimizar el rendimiento de la CPU.
  • Para una depuración más avanzada, stracelsof y fuser son tus aliados para rastrear y analizar llamadas del sistema o archivos abiertos.
  • systemctl y service son indispensables para gestionar servicios y procesos del sistema, con systemctl siendo más común en sistemas modernos.
  • Usa uptimevmstat e iostat para obtener estadísticas del sistema y evaluar su rendimiento general.

Secuencias de ESC desde Consola SSH para Netterm

Se pueden usar comandos especiales en la consola Linux SSH desde Netterm para conseguir efectos sobre el terminal del cliente windows o cambiar aspectos generales.

Estas son todas las secuencias válidas

^[[]URL^[[0*Send the URL to the client’s WWW browser for processing.
^[[]COMMAND^[[1*Start/run the program specified by COMMAND.
^[[]COMMAND^[[2*Define the International keyboard/video map to use.
^[[]COMMAND^[[3*Define the keyboard definition template to use.
^[[]COMMAND^[[5*Define and execute a QuickButton style command .
^[[]DIRECTORY^[[6*Change the file transfer download directory to DIRECTORY.
^[[]DIRECTORY^[[7*Change the file transfer upload directory to DIRECTORY.
^[[]FILENAME^[[8*Define the file(s) to upload on the next upload request. FILENAME must contain a complete pathname. If FILENAME has a quote delimited string prior to the actual filename, the quotes will be stripped and the resulting text will be sent to the host. For example, «rz» c:/work/myfile.txt will define c:\work\myfile.txt as the file to upload and NetTerm will send the string rz to the host, resulting in an automatic zmodem upload.
^[[]COMMAND^[[9*Start/run the program specified by COMMAND and wait till it terminates. COMMAND can contain both the program to run and command line arguments.
^[[]COMMAND^[[10*Check the status of the 1, 9, 12 and 13 special escape requests. If the operation was successful, an ascii 1 will be send to the host, else an ascii 0.
^[[]TEXT^[[11*Place the string TEXT on the Windows clipboard.
^[[]FILENAME^[[12*Start the program associated with the extension contained within FILENAME.
^[[]DIRECTORY^[[13*Change the current working directory to DIRECTORY.
^[[]User Information^[[16*Bring up the Setup Printer dialog panel. The optional User Information string is displayed in the setup printer dialog panel. An ASCII «0» will be returned if the user selects the cancel button, else an ASCII «1» will be returned. This escape sequence can be used to allow a user to select another printer/font/font size for a transparent print request.
^[[80mChange the font to the default 80 columns font.
^[[132mChange the font to isi_132 (132 column mode).
^[[7ITurn on the locator controller mode.
^[[6IIf the locator controller mode has been selected, this will turn it off.
^[[=MMESSAGE^[[=SDisplay MESSAGE in the StatusBar
^[[=mTITLE^[[=SSet the NetTerm window title to TITLE.
^[[=K0Clear all the QuickButton labels.
^[[=k0Clear all the QuickButton transmitted key data values.
^[[=KnbDATASet the QuickButton labels.
^[[=knbDATASet the QuickButton transmitted key data values.

Donde ^[ es el carácter ESC (0x1b), URL es cualquier URL válida y COMMAND es cualquier programa válido de DOS o Windows. La longitud máxima de los valores MESSAGE y TITLE es de 80 caracteres; URL, COMMAND, DIRECTORY, FILENAME y TEXT tienen una longitud máxima de 2047 caracteres. Cuando se especifica una ruta completa y un nombre de archivo, utilice la barra diagonal en lugar de la barra diagonal inversa. Por ejemplo:

d:/user/files/myeditor.exe

Las secuencias de escape de QuickButton para establecer la etiqueta y los valores de datos de clave transmitidos deben tener el siguiente formato::

nThe total number of label(s) or transmitted key data value(s) following (maximum of 9).
b The button this entry pertains to (valid values are 1-9).
DATAThe value to set the label/data value to.

Tenga en cuenta que DATA tiene una longitud máxima de nueve caracteres y una longitud obligatoria de nueve caracteres. Se deben utilizar espacios finales para que cada campo DATA tenga nueve caracteres de longitud. Se puede definir un máximo de nueve botones en la emulación BA-80, ocho botones en todas las demás. Las definiciones de QuickButton no se guardan cuando NetTerm sale.

La capacidad de iniciar o ejecutar programas en la estación de trabajo local puede crear serios problemas de seguridad. Por este motivo, un indicador global controla si NetTerm respetará una solicitud del host para iniciar o ejecutar programas locales. El valor predeterminado es no permitir que ningún host inicie o ejecute programas locales. Si NetTerm detecta una solicitud de este tipo, se mostrará un mensaje indicando una violación de seguridad. Para habilitar la capacidad de iniciar o ejecutar programas, debe estar habilitada la opción «Permitir llamadas de programa». Esta opción se encuentra en la pestaña Opciones-Configuración-Configuración global-General.

La opción «Permitir llamadas de programa» no se aplica a las operaciones relacionadas con el navegador (URL) o el editor (como las solicitudes de impresión transparente o netedit).

NetTerm también ha implementado el Modelo de entrada de localizador para terminales ANSI (sexta revisión). Este modelo define un método para controlar un dispositivo serial ubicado en un puerto de comunicación serial y la capacidad de controlar un dispositivo señalador como un mouse.

El modo de controlador de localizador permite que el host se comunique directamente con el dispositivo localizador sin la intervención del terminal. Cuando se configura el modo de controlador de localizador, todos los datos recibidos en el puerto host se transfieren directamente. El puerto serial para el dispositivo localizador debe definirse en el panel de diálogo Opciones-Configuración-Configurar controlador de localizador.

Además de brindar soporte para el dispositivo controlador de localizador, NetTerm implementó el modelo de entrada de localizador según lo definido por DEC. El modelo de entrada de localizador permite máxima flexibilidad y control de eventos del mouse desde el sistema host. Consulte la especificación DEC para obtener detalles completos y las secuencias de escape requeridas..


Procmail – Filtrando correo

Una regla tiene un aspecto similar al siguiente esquema:

:0 [opciones] [ : ]
* condicion A
* condicion B
* condicion C
etc...
* condición N
comando a ejecutar

Tras cada :0 podemos utilizar las siguientes opciones:

  • Opción H -> La condición se comprobará en la cabecera del mensaje en curso (valor por defecto).
  • Opción B -> La condición se comprobará en el cuerpo del mensaje.
  • Opción D -> Hace la comprobación case sensitive, es decir, se distingue entre mayúsculas y minúsculas.
  • Opción i -> Ignorar cualquier error ocurrido en la regla.
  • Opción c -> crea un Carbon Copy, es decir, hace que la regla sea no terminal. Si existe una c en las opciones de la regla, tras finalizar el procesado de la misma se crea una copia del mensaje para que se puedan verificar más reglas.
  • Opciones w y W -> Espera a que se finalice la ejecución del comando de esa regla para poder recibir el código de salida del mismo. La opción W hace lo mismo que w pero en caso de ocurrir algún error no emite ningún mensaje sobre el mismo.
  • Opción f -> Hace a procmail actuar como un filtro. Esto quiere decir que tras ejecutarse las acciones pertinentes sobre el mensaje se generará un nuevo mensaje de salida que pasará por el resto de reglas del fichero. Esto sirve para modificar campos o valores de un email. Los filtros son, pues, otro tipo de reglas no terminales, pues tras modificar el mensaje seguimos haciéndolo pasar por el resto de reglas.
  • Opción h -> Hace que en un filtro sólo se filtre la cabecera (que la cabecera se pase al comando especificado).
  • Opción b -> Hace que en un filtro sólo se filtre el cuerpo o body (que sólo se le pase el cuerpo al comando).
  • Opción E y e-&t; Hace que se ejecute la regla sólo si la anterior regla no se ejecutó. En el caso de la e minúscula, sólo se ejecutará una regla si la que la precede en el fichero de reglas se intentó ejecutar pero produjo algún error.
  • Opción A y a-> Hace que se ejecute la regla sólo si la anterior regla se ejecutó. En el caso de la a minúscula, sólo se ejecutará una regla si la que la precede en el fichero de reglas se ejecutó sin producir errores.
  • Opción r -> Entrega el mensaje sin realizar correcciones ni comprobaciones

Las condiciones son propiamente la regla en sí, y en caso de que se cumplan se procederá a ejecutar el comando especificado pasándole el mensaje en función de las opciones que hubiesemos seleccionado (por defecto pasandole la cabecera y el cuerpo). Toda condición empieza por un símbolo ‘*’ y suelen estar constituidas por expresiones regulares (del tipo de grep, rgrep, etc.) que consisten en búsquedas de cadenas de carácteres en las diferentes partes del mensaje. En una expresión regular se utilizan los siguientes símbolos:

  • Símbolo ‘^’ -> Indica el comienzo de una línea.
  • Símbolo ‘$’ -> Indica el final de una línea.
  • Símbolo ‘*’ -> Indica cero o más veces.
  • Símbolo ‘?’ -> Indica cero o una vez.
  • Símbolo ‘+’ -> Indica una o más veces.
  • Símbolo ‘.’ -> Cualquier carácter excepto un \n (salto de línea).
  • Símbolo [a-z] -> Que quede en un rango de carácteres (primero-último).
  • Símbolo [^a-z] -> Que no quede en un rango de carácteres (primero-último).
  • Símbolo ‘|’ -> Permite especificar operación O ( a | b = ‘a’ o ‘b’ )

Al comienzo de la línea de condición tambien pueden existir opciones sobre esa condición:

  • Símbolo ‘<‘ -> Permite comprobar si el fichero tiene un tamaño menor al especificado.
  • Símbolo ‘>’ -> Permite comprobar si el fichero tiene un tamaño mayor al especificado.
  • Símbolo ‘!’ -> Invierte la condición (se cumplirá cuando la condición sea falsa).
  • Símbolo ‘$’ -> Realiza susticiones de variables en las expresiones regulares.
  • Símbolo ‘?’ -> Necesita el resultado que devuelve el programa especificado.

COMANDOS

Tras cada condición se especifica un comando para que sea ejecutado si la regla se cumple. Distinguimos principalmente cuatro comandos básicos:

1. Fichero: Hace que procmail añada el mensaje al final del fichero, con otros posibles mensajes.

2. Directorio: Hace que procmail guarde el mensaje en el directorio con un nombre propio no repetido.

3. !direccion@email.es: Mediante el carácter ‘!’ podemos enviar el mensaje a la dirección de correo especificada.

4. |programa: El carácter ‘|’ permite ejecutar un programa/comando de linux. La salida del programa saldrá por la salida estándar, aunque se puede redirigir a cualquier lado con el redireccionamiento estandar de linux (>/dev/null, >fichero, etc). También es posible asignar la salida del programa a una variable de entorno.

Ordenando arrays

Algunas veces es necesario trabajar con arrays ordenados de mayor a menor o viceversa. Esto se suele hacer usando locate para controlar la entrada de los datos en el array de forma ordenada; pero se pude dar el caso de que hagamos una carga secuencial y luego queramos que todo se ordene. Aquí es donde opera la magia.

En el caso de hacerlo con locate podremos usar este código entendiendo que la variable namesite no se repite y es por donde queremos ordenar

locate(namesite,myarray,1;index1;’AL’) then
* existe namesite, y podemos actualizar o sumar o lo que sea en otros atributos como por ejemplo
myarray<2,index1>+=ocupag
end else
* no existe namesite y tenemos la posicion, insertamos
myarray=insert(myarray,1,index1;namesite)
myarray=insert(myarray,2,index1;ocupag)
end

La alternativa es que hayamos cargado todo en secuencial y al final optamos por colocarlo usando la función u1072.

Para ello vamos cargan nuestro array de forma secuencial con un simple myarray<-1>=’valor’ o valores y al terminar procesamos la función :

myarray=oconv(myarray,’u1072′);* Orden Ascendente

Y el contenido de myarray estará colocado en orden ascendente. No es posible a la inversa pero siempre se puede recorrer el array de atras adelante para obtener ese efecto.

Sustituyendo cadenas de caracteres en D3

Hay veces que necesitamos cambiar algún contenido de una cadena de caracteres por otro y esto en D3 se hace fácil, pero hay que acordarse; por es lo escribo aquí

Por un lado, cambiar un solo carácter, se hace directamente con la función convert

convert ‘caracter1’ to ‘caracter2’ in string

Pero el problema esta cuando queremos una varios caracteres , no solo uno.

Aquí podemos usar el bucle de búsqueda como el siguiente :

  • loop
  • aa=index(string,’grupodecaracteres’,1)
  • while aa do
  • string[aa,lendelgrupodecaracteres]=nuevoscaracteres
  • repeat

Ya, la forma más técnica usando las funciones que nos proporciona d3, seria llamando a la u009e de forma que haga el reemplazo del tirón , sin bucle

string=oconv(«u»:att:’quecambiamos’:att:’queponemos’:att:string,’u009e’)

A vueltas con DKIM

A vueltas con el DKIM, es un texto que dejo para seguir los pasos que voy dando y las explicaciones oportunas sobre porque falla y como lo resuelvo, si es que lo logro.

El escenario es un servidor donde hay otros dominios que SI resuelven bien DKIM, y tan solo uno de ellos se está negando a resolver la firma. De hecho voy a probar otro dominio por si la casualidad existe, no sea que realmente fallan todos, excepto uno.

Al tratarse del mismo servidor, mismo sendmail y misma configuración DNS, la cosa se complica. He generado de nuevo el DKIM pero no es eso, tras esperar unas horas a que se replique de forma correcta, sigue fallando.

Hago las pruebas de validez, enviando email a https://dkimvalidator.com y puedo comprobar si recibe correctamente la firma DKIM

Retrieved this publickey from DNS: v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpeeqnCTHsa1mYhOfKM1uXNtzY4Yu7aSRa0bOkce8inBHr0xGpnyz26p2ax9Gwh7afSclFrc+o84W1o+no/vzAznEAxXEJs39CwXtfa/YQXMnIZPrhl+xYFTbC+hzjSRfexLu/+wfawnjyQG94iRz3X7+tlG5Ij7T8Sz4moM4FVwIDAQAB

Y es correcta, la misma que tengo en el DNS tras esperar un tiempo de replicación, de unas 2 horas máximo.

Validating Signature 
result = fail
Details: bad RSA signature

Y sin embargo esta generada de nuevo limpiamente. He probado con otro dominio, del mismo servidor y el resultado es pass ; osea que el problema, es solo en este, que raro suena. Pensé que podía faltar su entrada en el archivo keylist, pero no, estaba ahí.

Con palo de ciego veo que el SPF tiene declarada una ipv4 mal, es decir, un numero erróneo, lo corrijo con esperanza de que suene la flauta porque realmente digo que poco tendrá que ver el SPF de una IP mala que ademas no es la que esta enviando.

Una prueba nueva, sencilla de hacer, intercambio los datos de dos dominios, uno que funciona y el que falla, de forma que sustituyo en ambos las claves publicas y privadas en el directorio dkim-milter ademas de cambiar las publicas del DNS. Con esto veremos que pasa en ambos dominios. Se intercambian las situaciones ?

Pues no, lamentablemente, fallan los dos dominios. Vamos a ver si reponiendo la situación se vuelven a poner las cosas, al menos, como antes. De momento parece que el error esta en las KEYS generadas nuevas. Si repongo la antigua y funciona, será que el nuevo generador de claves es erróneo y habrá que anailizar el tipo de clave vs confgiuración del dkim que no cuadra bien.

De Locos, me quedo en blanco y resulta que solo tuve que relanzar el demonio dkim-milter para que todo se solucionara; eso si, previo quitar las lineas duplicadas y hasta triplicadas que había en el archivo keylist; que de hay venia el error.

Convirtiendo juegos de caracteres

Mejorando nuestro producto prod3erp que conecta directamente la base de datos pick d3 con el apache linux (si alguno esta interesado se comercializa).

Pues bien, al transmitir datos con caracteres especiales, se producen varios probleas. Si el dato entra desde la web (en UTF8 o en ISO8859) el Pick D3 no lo reconoce correctamente y muestra en la consola o los programas que se ejecuten caracteres extraños; y a la inversa, si los datos se introducen con el teclado en la consola Pick, tenemos una correcta visualización en los programas internos pero unos caracteres extraños cuando se transmiten al Apache y se muestran en webs UTF 8 o ISO8859.

Después de dar muchas vueltas, decidó que lo mejor es estandarizar ambos juegos de caracteres y buscar un protocolo en medio que los convierta sin necesidad de tener que preocuparme por ello. Para estar todo correcto doy por supuesto que la web va a trabajar en UTF-8 y la base de datos D3 Pick en codigo CP850.

En el sistema prod3erp incluyo entonces un protocolo que convierte todo lo que entra en UTF-8 o ISO8859 a codigo CP850 y otro protocolo en salida que convierte de CP850 a UTF-8.

Problema resuelto.

Para hacerlo me he apoyado en las utilidaddes de linux file e iconv que me indican el tipo de archivo que es y me permietn hacer las conversiones. Esto que a priori podria haber lentificado el proceso es lo suficientemente rápido como para que no se note la velocidad.

A vueltas con el ASCII

Siempre que me topo con una necesidad de conversión de códigos ASCII en D3, me cuesta recordar cual es la función para obtener el código a partir de un carácter. Y esto es porque esa función, al menos yo, se usa mucho menos. En fin, el caso es que un día me prometí escribir todo aquello que me obliga a buscar documentación o investigar cuando estoy tirando código.

En este caso, el tiempo de búsqueda a sido bastante corto, así que el artículo, también será corto.

Al grano. La función para obtener el carácter a partir de un código ascii es CHAR, mientras que la inversa, la que he buscado, es SEQ.

De esta forma, si queremos obtener el código ascii de la ‘A’ será :

SEQ(‘A’)

Lo que respondera con un bonito 65: mientras que si queremos obtener el carácter que corresponde al código ascii 65 será :

CHAR(65)

Que nos devolverá una bonita ‘A’

Y esto es todo de este sencillo post que solo servirá para que yo localice el seq de forma más rápida la próxima vez que lo necesite.

Mezclando listas anidadas con D3 – Uso de READNEXT #2

Como continuación del articulo anterior, puedo añadir una informacion adicional que he tenido que recuperar al encontrarme con un sistema mas antiguo que no soporta el uso del rtnlist en la sentencia execute.

Hay una alternativa, pero solo controlaremos dos listas, una primaria y una secundaria, si bien es cierto que será mas que suficiente en la mayoria de los casos.

La primera lista sera generada con normalidad sin datos adicionales y sera en el segundo select donde añadimos la opción (s que convierte la selección en secundaria. De esta forma podremos usar el readnext con el modificador secondary y no se mezclan los punteros de los respectivos readnext.

Intentare que se vea mas claro con este ejemplo del mismo código del ejemplo anterior adaptado a esta nueva forma de controlar las listas :

execute «lista colores»
loop
readnext color
execute «selecc articulos con color =»:color:» (s»
loop
readnext itemarticulo secondary
….. sentencias con itemarticulo …
until eof do repeat
until eof do repeat

De esa nueva forma también se pueden anidar listas y ejecuciones selecc sin preocuparnos de que se mezclen punteros y por tanto resultados.

Mezclando listas anidadas con D3 – Uso de READNEXT

En ocasiones exigencias del guión obligan a trabajar con listas dentro de listas; esto, provoca que tengamos que controlar muy ben de donde tira nuestro readnext si no queremos sorpresas y errores de logica.

Me explico, supongamos que hacemos un select de un fichero y luego del resultado que recorremos secuencialmente debemos hacer un nuevo select para recorrer secuencialmente otra lista. Que lio no !!!

Pondre un ejemplo mas claro. Imaginar que tenemos que sacar una lista de colores grbada previamente y que de cada color de la lista debemos sacar los articulos que tienen ese color con un selecc de articulos con color =»X» para sacar finalmente un listado de ellos.

Si hacemos este codigo : (pongo solo las lineas afectadas)

execute «lista colores»
loop
readnext color
execute «selecc articulos con color =»:color
loop
readnext itemarticulo
….. sentencias con itemarticulo …
until eof do repeat
until eof do repeat

Tendremos el problema de que se mezclan los readnext de ambas sentencias selecc y no funcionara correctamente, para eso usamos el asignar a una variable una lista de forma que podamos usarla focalizada en el readnext.

Usamos la sentencia rntlist de execute y la cosa quedaria asi, mas o menos :

execute «lista colores» rtnlist lista1
loop
readnext color from lista1
execute «selecc articulos con color =»:color rtnlist lista2
loop
readnext itemarticulo from lista2
….. sentencias con itemarticulo …
until eof do repeat
until eof do repeat

De esa sencilla forma se pueden anidar listas y ejecuciones selecc sin preocuparnos de que se mezclen punteros y por tanto resultados.