Crear un espacio de nombres PID
El comando correcto para usar aquí es unshare. Tenga en cuenta que las opciones necesarias para hacer esto solo están disponibles en util-linux 2.23. La idea es crear un nuevo espacio de nombres PID para el programa que está ejecutando de modo que todos sus hijos también se creen en este espacio de nombres. Puede ejecutar un comando en un nuevo espacio de nombres PID simplemente haciendo:
sudo unshare -fp some_command
Para ejecutar un shell, simplemente omita el comando. Esto creará un proceso que, junto con cualquiera de sus elementos secundarios, tendrá un PID como de costumbre dentro del espacio de nombres padre (sistema). Sin embargo, dentro del nuevo espacio de nombres, tendrá un PID 1junto con algunas de las características especiales del initproceso. Quizás la característica más relevante desde una perspectiva de monitoreo es que si alguno de sus descendientes queda huérfano, se volverá a criar en este proceso en lugar del initproceso real .
Simplemente hacer esto puede ser suficiente para la mayoría de los casos de monitoreo. Como se mencionó anteriormente, todos los procesos dentro del espacio de nombres tienen PID dentro del espacio de nombres padre, por lo que se pueden usar comandos regulares para monitorear su actividad. También estamos seguros de que si algún proceso en el espacio de nombres queda huérfano, no se caerá de las ramas del árbol de procesos debajo del PID del programa de nivel superior, lo que significa que aún se puede seguir fácilmente.
Combinar con un espacio de nombres de montaje
Sin embargo, lo que no podemos hacer es monitorear el proceso con respecto al PID que cree que tiene. Para hacer esto, y en particular para poder usar el pscomando dentro del nuevo espacio de nombres, debe montar un procfssistema de archivos separado para el espacio de nombres. Esto a su vez conduce a otro problema ya que la única ubicación que psacepta procfses /proc. Una solución sería crear una chrootcárcel y montar la nueva procfsallí. Pero este es un enfoque engorroso ya que, como mínimo, tendríamos que copiar (o al menos un enlace rígido) cualquier binario que pretendamos usar junto con cualquier biblioteca de la que dependan en la nueva raíz.
La solución es utilizar también un nuevo espacio de nombres de montaje . Dentro de esto, podemos montar el nuevo procfsde una manera que use el /procdirectorio raíz verdadero , pueda usarse dentro del espacio de nombres PID y no interfiera con nada más. Para simplificar este proceso, el unsharecomando ofrece la --mount-procopción:
sudo unshare -fp --mount-proc some_command
Ahora ejecutándose psdentro de los espacios de nombres combinados mostrará solo los procesos con el espacio de nombres PID y mostrará que el proceso de nivel superior tiene un PID de 1.
¿Qué hay de nsenter?
Como su nombre lo indica, nsenterse puede usar para ingresar un espacio de nombres que ya se ha creado con unshare. Esto es útil si queremos obtener información solo disponible dentro del espacio de nombres de un script que de otro modo no estaría relacionado. La forma más simple es acceder a dar el PID de cualquier programa que se ejecute dentro del espacio de nombres. Para que quede claro, este debe ser el PID del programa de destino dentro del espacio de nombres desde el que nsenterse ejecuta (dado que los espacios de nombres pueden estar anidados, es posible que un solo proceso tenga muchos PID). Para ejecutar un shell en el espacio de nombres PID / mount de destino, simplemente haga lo siguiente:
sudo nsenter -t $PID -m -p
Si este espacio de nombres está configurado como anteriormente, psahora solo se enumerarán los procesos dentro de ese espacio de nombres.
initproceso de estilo de nivel superior muere, no puedes crear más.manun fin de semana para mí, quiero familiarizarme un poco más. Gracias de nuevo. Quizás tenga más relevancia en el--userespacio de nombres.