
ユーザーのプロセスを変更して、その cwd を設定できるようにしたいと考えています。
関連、および二次的な質問ですが、アンマウントしたいファイルシステムがありますが、ユーザーが bash プロセスでそのファイルシステムを使用しています。そのユーザーのプロセスを強制終了したくはありませんが、ディスクをアンマウントする間、そのプロセスを ... /tmp などに穏やかにリダイレクトしたいと思います。
明らかに私はルートです。
答え1
プロセスの作業ディレクトリを、ルートかどうかに関係なく、その外部から変更する方法はありません。これは、被害プロセスにとって非常に迷惑なことであり、そのための API が存在しないのです。
ここで、汚いトリックを使うこともできます。その1つは、ターゲットプロセスにデバッガーを接続し、chdir
それを強制することです。Stack Overflowのこの質問一部のオペレーティング システムでは、このようなタスクを実行するための他の API が提供される場合があります (予期しないプロセスにシステム コールを挿入する)。
誰かのファイルシステムを再マウントするという目標については、技術的にハッキングできたとしても、基本的に望みはありません。プロセスは「古い」マウントにファイル記述子を開いている可能性があり、対応するファイルがまだそこにあったとしても、「新しい」マウントのファイルにそれらを正しく再アタッチするポータブルな方法はありません。
理論的にはうまくいくと思われるアプローチは、メンテナンスのために邪魔にならないようにしたいプロセスを休止状態にすることです。しかし、これには多くの問題があります。特に、プレーンファイルだけでなくネットワークソケットを考慮するとなおさらです。(この他の質問興味深い点がいくつかあります。
つまり、礼儀正しく(猶予期間付きで)行う方がよいでしょう。ランダムなプロセスでkill
ゲームをプレイすると、どのような予期しない結果が発生するかはわかりません。cwd
答え2
プロセスは自身の現在のディレクトリを管理する責任があります。外部から変更する方法はありません。
プロセスに自身のディレクトリを変更させることで、ごまかすこともできます。ルートとして、またはプロセスと同じユーザーとして実行している場合は、ptrace
システム コールは、プロセスのメモリを不正に変更したり、システム コールを実行したりするなど、プロセスに対してあらゆる侵入行為を実行します。デバッガーはこれを使用します。
これを実験的な外科手術のように扱ってください。患者は無傷で目覚めるか、死ぬかのどちらかです。プロセスが現在のディレクトリが何であるかをあまり気にしないのであれば、これはうまくいくはずです。シェルのように、現在のディレクトリと密接な関係があるプログラムは、生き残る可能性は低いでしょう。
以下は、ハングした NFS マウントからプロセスを移動するために私が過去に使用したスクリプトです。自己責任で使用してください。
#!/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