cwdを設定できるようにユーザープロセスを変更したいと思います。
関連性があり、中学校この質問にはアンマウントしたいファイルシステムがありますが、ユーザーはbashプロセスを使用してその上に座っています。そのユーザーのプロセスを終了したくありませんが、ディスクがアンマウントされたときにプロセスを... / tmpにスムーズにリダイレクトしたいと思います。
私は明らかにルートです。
答え1
ルートの有無にかかわらず、プロセスの外部で作業ディレクトリを変更する方法はありません。これは被害者プロセスに大きな干渉を引き起こし、対応するAPIはありません。
これで、汚いトリックを使用することができます。その1つは、デバッガをターゲットプロセスに接続して強制することですchdir
。スタックオーバーフローに関するこの質問。一部のオペレーティングシステムでは、これらのタスク(疑わしいプロセスへのシステムコールの挿入)を実行するための追加の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