--- name: close_onlyoffice_instance kind: function lang: bash domain: shell version: "1.0.0" purity: impure signature: "close_onlyoffice_instance(instance: string = demo, [--purge]) -> json" description: "Termina el/los proceso(s) DesktopEditors de una INSTANCIA AISLADA (slot) de ONLYOFFICE Desktop Editors, identificados por su HOME=/tmp/oo_ leido de /proc//environ — asi NUNCA mata la instancia personal del usuario, solo la aislada. Envia SIGTERM, espera ~3s por evento (read -t, sin sleep foreground) y SIGKILL a los que sigan vivos. Con el flag --purge borra ademas los directorios del slot (/tmp/oo_*). Imprime JSON con instance, killed_pids (array), purged y status (closed|not_running)." tags: [onlyoffice, desktop, x11, shell] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: instance desc: "nombre del slot aislado a cerrar (default: demo). Solo se matan procesos DesktopEditors cuyo HOME sea /tmp/oo_" - name: --purge desc: "flag opcional: si se pasa, borra los directorios del slot (/tmp/oo_*) tras matar los procesos. Sin el flag, solo termina procesos y deja el estado del slot en disco" output: "una linea JSON a stdout: {\"instance\":\"\",\"killed_pids\":[],\"purged\":true|false,\"status\":\"closed\"|\"not_running\"}. Exit 0 siempre que opere bien (closed si mato procesos, not_running si no habia ninguno del slot), exit 1 si falta dependencia, exit 2 si flag desconocido" tested: false tests: [] test_file_path: "" file_path: "bash/functions/shell/close_onlyoffice_instance.sh" --- ## Ejemplo ```bash # Cerrar el slot demo (deja /tmp/oo_demo* en disco para reusar la config) bash bash/functions/shell/close_onlyoffice_instance.sh demo # Cerrar y limpiar todo el estado del slot bash bash/functions/shell/close_onlyoffice_instance.sh demo --purge # Slot por defecto (demo) sin argumentos bash bash/functions/shell/close_onlyoffice_instance.sh # Via fn run ./fn run close_onlyoffice_instance_bash_shell reporte --purge # Sourceado source bash/functions/shell/close_onlyoffice_instance.sh out=$(close_onlyoffice_instance demo --purge) echo "$out" # {"instance":"demo","killed_pids":[12345,12350],"purged":true,"status":"closed"} ``` ## Cuando usarla - Cuando terminas un flujo automatizado con ONLYOFFICE Desktop y quieres **cerrar la instancia aislada por completo** (cerrar la ventana con `wmctrl` deja el proceso vivo; esta funcion mata el proceso real). - Para **liberar recursos** de un slot que ya no usas, opcionalmente borrando su estado en /tmp con `--purge`. - Como ultimo paso del ciclo open -> reload -> close, garantizando que no quedan procesos huerfanos de la instancia aislada. ## Gotchas - **Solo mata la instancia aislada**: identifica procesos por `HOME=/tmp/oo_` en `/proc//environ`. La instancia personal del usuario (HOME real) NUNCA se toca. Esto es por diseño y por seguridad. - **Cerrar la ventana NO mata el proceso**: por eso esta funcion existe. Tras `reload`/`wmctrl -ic` el proceso de la instancia aislada sigue vivo (deseable para reusar). Usa esta funcion para terminarlo de verdad. - **`--purge` borra /tmp/oo_***: pierdes la config del slot (perfil, recientes). El slot se recreara limpio en el siguiente `open`. Sin `--purge`, el estado persiste y el siguiente arranque reusa esa config. - **El slot vive en /tmp**: aunque no purgues, `/tmp/oo_*` se pierde al reiniciar el PC. Estado desechable. - **Requiere X11 + wmctrl + xdotool** instalados (coherencia con el grupo, aunque esta funcion solo usa /proc para matar). Comprueba `command -v` y falla claro si falta alguna; no funciona en Wayland puro sin XWayland para el resto del grupo. - **Carrera de /proc**: si un pid muere entre listarlo y leer su environ, se ignora silenciosamente (guardas `2>/dev/null || true`); no rompe la funcion (`set -uo pipefail` sin `-e`). - **SIGKILL como ultimo recurso**: tras ~3s de SIGTERM, los procesos vivos reciben SIGKILL. Cambios sin guardar en la app (si los hubiera) se pierden — pero el flujo previsto edita en disco, no en la app, asi que no deberia haber estado sin guardar.