
Estoy buscando cambiar el proceso de un usuario de modo que pueda configurarlo como cwd.
Relacionado ysecundarioA la pregunta, tengo un sistema de archivos que quiero desmontar pero un usuario está sentado en él con un proceso bash. No quiero matar el proceso de ese usuario, pero me gustaría redirigirlo suavemente para que diga ... /tmp mientras desmonto el disco.
Soy root obviamente.
Respuesta1
No hay forma de cambiar el directorio de trabajo de un proceso desde fuera de él, ya sea raíz o no. Eso sería extremadamente perturbador para el proceso de la víctima y simplemente no existe una API para ello.
Ahora podrías usar trucos sucios. Uno de ellos es adjuntar un depurador a su proceso de destino y forzarlo chdir
; consulteesta pregunta en Stack Overflow. Algunos sistemas operativos pueden ofrecer otras API para realizar dichas tareas (inyectando llamadas al sistema en procesos desprevenidos).
En cuanto a su objetivo de volver a montar un sistema de archivos debajo de alguien, eso es esencialmente inútil, incluso si técnicamente logra piratearlo: es probable que el proceso tenga descriptores de archivos abiertos en el montaje "antiguo" y no existe una forma portátil de volver a montar correctamente. -adjuntarlos a archivos en el soporte "nuevo", incluso si los archivos correspondientes todavía están allí.
Un enfoque que parecería funcionar en teoría sería hibernar los procesos que desea eliminar para ese mantenimiento. Pero hay muchos problemas con eso, especialmente considerando no sólo los archivos simples sino también los sockets de red. (Veresta otra preguntapara algunos puntos interesantes.)
En resumen, es mejor que sea cortés kill
(con un período de gracia), no se sabe qué consecuencias inesperadas podrían surgir al jugar en cwd
un proceso aleatorio.
Respuesta2
Un proceso es responsable de gestionar su propio directorio actual. No hay forma de cambiarlo desde fuera.
Puedes hacer trampa haciendo que el proceso cambie su propio directorio. Si está ejecutando como root, o como el mismo usuario que el proceso, puede usar elptrace
llamada al sistema para hacer todo tipo de cosas invasivas en un proceso, incluido cambiar su memoria delante de sus narices y realizar llamadas al sistema. Esto es lo que usan los depuradores.
Trate esto como una operación quirúrgica experimental. El paciente puede despertar ileso o morir. Esto debería funcionar si al proceso realmente no le importa cuál es su directorio actual. Es poco probable que un programa que tiene una relación íntima con su directorio actual, como un shell, sobreviva.
Aquí hay un script que he usado en el pasado para sacar procesos de montajes NFS colgados. Úselo bajo su propio riesgo.
#!/bin/sh
if [ $# -ne 2 ]; then
echo 1>&2 "Usage: $0 PID DIR"
exit 120
fi
case "$1" in
*[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
*[\\\"]*)
echo 1>&2 "Unsupported character in directory name, sorry."
exit 3;;
esac
gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF