izabera/pses una implementación en Bash pensada para imitar, dentro de Bash, una salida cercana aps auxincluso en situaciones donde no se pueden crear procesos nuevos- La condición clave es una situación en la que estás conectado por
ssha una máquina y tienes una bash shell de confianza, pero no puedes crear procesos nuevos porque todos los demás PID están en uso - El README presenta esta situación como ejemplo de pregunta de entrevista para puestos que requieren conocimientos de Bash/Linux
- La herramienta se describe como algo que permite “hacer de cuenta, más o menos” que tienes acceso a un
ps auxfuncional, y no garantiza ser una implementación de reemplazo completa - La frase “funciona al 100% en todas las máquinas y en todas las situaciones” se usa claramente como una garantía en tono de broma
Qué hace este proyecto
- Es un proyecto que implementa
ps auxsolo con Bash - El título del README es “
ps auxwritten entirely in bash without ever forking” - La característica central del proyecto es que no realiza ningún fork durante su ejecución
Situación prevista
- El escenario de ejemplo es el siguiente
- Estás conectado a una máquina por
ssh - El usuario está dentro de una bash shell familiar
- Pero no puede crear ningún proceso nuevo porque todos los demás PID están en uso
- Estás conectado a una máquina por
- El README explica que, bajo estas condiciones, podría hacer falta algo parecido a
ps aux
Alcance esperable y advertencias
- La herramienta se presenta como algo que permite “kinda sorta pretend” que tienes un
ps auxfuncional - La frase del README sobre “funcionar perfectamente en el 100% de las máquinas y en todas las situaciones, garantizado” está escrita como humor exagerado
- Por lo tanto, el punto central de la descripción no es la compatibilidad completa, sino imitar
ps auxusando solo Bash en un entorno extremo donde no se pueden crear procesos nuevos
1 comentarios
Comentarios de Hacker News
Me identificó el chiste de que el problema más difícil en ciencias de la computación al final era alinear columnas
He escrito funciones de alineación de columnas incontables veces en varios lenguajes y siempre fue doloroso; en la cabeza parece algo simple, como “calcular la longitud máxima de cada columna y agregar espacios hasta el siguiente múltiplo del tamaño del tabulador”
Incluso usando f-strings y padding en Python, el código se complica rápido y se vuelve difícil de leer; de hecho, mientras reescribía un ejemplo para un comentario, terminé corrigiendo varios bugs de lo terrible que era
Para un uso tan común, parecería obvio que existiera una librería, y sinceramente sorprende que no esté en la biblioteca estándar
La idea era sacar el ancho y nombre de las columnas desde
descriptiondel cursor de base de datos, construir las líneas divisorias y la cadena de formato, y luego imprimir las filas; no sé si se me escapó algún bug fatal, pero no me parece un problema particularmente difícilzip(*table), calcular la longitud máxima de cada columna y luego imprimir alineado conf"{r:<{w}}"El resultado de ejemplo queda como una tabla con anchos de columna alineados, tipo
agony | kick | pumpLos valores contienen espacios, están rellenados con espacios y a veces la alineación se rompe o se desborda de la columna
Mejor ponerse de acuerdo y no usar datos alineados por columnas, sino algún formato más simple y legible para humanos; sería mejor para todos
Si entré por SSH a una máquina, el shell de Bash sigue vivo pero ya se agotaron todos los PID y no se pueden crear procesos nuevos, me pondría a revisar el sistema de archivos
/proc/[pid]/para identificar qué proceso está agotando el espacio de PIDkillen Bash es un builtin del shell, así que no hace falta hacer fork de un proceso nuevo como con/bin/killSi se puede encontrar el proceso padre que está generando hijos y agotando los PID, se lo puede detener y recuperar el control del sistema
Este script también parsea
/procy, como no usa pipes ni sustituciones$(...)que creen subshells nuevos de Bash, queda bastante limpioAsí podía invocar las funciones POSIX necesarias sin ejecutar un comando separado, y la reacción fue buena
Puede ser más rápido reiniciar y recuperar después que intentar encontrar y matar el proceso padre en un entorno limitado; además, si ya se acabaron los PID, probablemente otras cosas también estén mal
ps(){ (cd /proc;for i in [0-9]*;do echo $i: $(tr '\0' ' ' < $i/cmdline);done); }/proc/[pid]/qué proceso está agotando el espacio de PID, pero según los comentarios del código fuente, al principio esperaban que con/proc/*/statusbastara, aunque ahí no se podían obtener valores como el uso de CPU[[ $cmdline ]] && exec {cmdline}>&-yexec {cmdline}< "$dir"/cmdline || continueEn 2011 tuve una entrevista para un puesto de SRE en una empresa tecnológica bastante grande de EE. UU., y en ese momento ni siquiera había escuchado el término SRE
La empresa estaba construyendo una alternativa a MS Office basada en navegador y, después de una llamada de filtro, tuve que programar en tiempo real mientras hablaba con el entrevistador dentro del editor de documentos de la propia empresa
Como en mi autoevaluación había puesto alto
shell scriptingyLinux, me dieron el ejercicio de hacer un reemplazo denetstaten Bash, pero en ese momento no sabía dónde ni cómo estaba la información de sockets dentro de/proc/, así que decidí rápido que no iba a poderEn cambio propuse hacer una versión reducida de
psyfuser, y la solución que entregué dentro de ese horroroso procesador de texto en el navegador fue aceptada, así que llegué hasta la entrevista presencialViéndolo ahora, quizá el escenario hipotético que motivó este ejercicio estaba más basado en la realidad de lo que parecía
Yo también empezaría por ahí
Hace tiempo hice por diversión un sitio web interactivo para explorar la situación de estar conectado por SSH sin poder crear procesos nuevos: https://oops.cmdchallenge.com
"echo *"no enumera todos los archivos del directorioHay que usar
"echo .* *"Me habría gustado revisar la lista de
"View Solutions"de otros niveles para ver qué otros enfoques eran posiblesIzabera es una de las personas más cracks de #bash@libera
Desde la época de freenode he aprendido muchísimo de gente así durante los últimos 10 años
Esto es un Bash bastante limpio
Por experiencia, el código Bash suele estar mal escrito y ser ineficiente, pero este parece un buen ejemplo de que no siempre es así
¿Qué se hace si estás dentro de un shell POSIX confiable pero sin soporte de Bash?
Este script de Bash no es compatible con POSIX
Este script no funciona en Bash 3.2, pero sí en Bash 4.2
En Bash 3.2 aparece el error
printf: '(': invalid format character, y el entorno de ejemplo esbash-3.2-33.el5_11.4.0.1Un uso mejor podría ser ver la lista de procesos en un sistema sin procps instalado
Está bastante bien
También se pueden hacer listeners y clientes en Bash
No lo recomendaría en producción