
Estou procurando alterar o processo de um usuário para que eu possa definir seu cwd.
Relacionado, esecundárioà pergunta, tenho um sistema de arquivos que desejo desmontar, mas um usuário está nele com um processo bash. Não quero encerrar o processo desse usuário, mas gostaria de redirecioná-lo gentilmente para dizer ... /tmp enquanto desmonto o disco.
Estou root obviamente.
Responder1
Não há como alterar o diretório de trabalho de um processo fora dele, seja root ou não. Isso seria extremamente perturbador para o processo da vítima e simplesmente não existe uma API para isso.
Agora você pode usar truques sujos. Um deles é anexar um depurador ao seu processo de destino e forçar um chdir
nele - vejaesta pergunta no Stack Overflow. Alguns sistemas operacionais podem oferecer outras APIs para realizar tais tarefas (injetando syscalls em processos inocentes).
Quanto ao seu objetivo de remontar um sistema de arquivos sob alguém, isso é essencialmente inútil, mesmo que você consiga hackeá-lo tecnicamente - é provável que o processo tenha descritores de arquivo abertos na montagem "antiga" e não haja uma maneira portátil de reinstalá-lo corretamente. -anexe-os aos arquivos na "nova" montagem, mesmo que os arquivos correspondentes ainda estejam lá.
Uma abordagem que parece funcionar em teoria seria hibernar os processos que você deseja tirar do caminho para essa manutenção. Mas há muitos problemas com isso, especialmente considerando não apenas arquivos simples, mas também soquetes de rede. (Veressa outra perguntapara alguns pontos interessantes.)
Resumindo, é melhor ser educado kill
(com um período de carência), não há como dizer quais consequências inesperadas podem surgir ao jogar em cwd
um processo aleatório.
Responder2
Um processo é responsável por gerenciar seu próprio diretório atual. Não há como mudar isso de fora.
Você pode trapacear, fazendo com que o processo mude seu próprio diretório. Se você estiver executando como root ou como o mesmo usuário do processo, poderá usar optrace
chamada de sistema para fazer todo tipo de coisas invasivas em um processo, incluindo alterar sua memória debaixo do nariz e realizar chamadas de sistema. Isso é o que os depuradores usam.
Trate isso como uma operação cirúrgica experimental. O paciente pode acordar ileso ou morrer. Isso deve funcionar se o processo não se importar realmente com o diretório atual. É improvável que um programa que tenha um relacionamento íntimo com seu diretório atual, como um shell, sobreviva.
Aqui está um script que usei no passado para remover processos de montagens NFS travadas. Use por sua conta e risco.
#!/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