
Я хочу изменить процесс пользователя таким образом, чтобы можно было задать его cwd.
Связанные, ивторичныйна вопрос, у меня есть файловая система, которую я хочу размонтировать, но пользователь сидит на ней с процессом bash. Я не хочу убивать процесс этого пользователя, но я хотел бы аккуратно перенаправить их, скажем, в ... /tmp, пока я размонтирую диск.
Я, очевидно, root.
решение1
Нет способа изменить рабочий каталог процесса извне, будь то root или нет. Это было бы крайне неприятно для процесса-жертвы, и для этого просто нет API.
Теперь вы можете использовать грязные трюки. Один из них — присоединение отладчика к целевому процессу и принудительное включение chdir
его — см.этот вопрос на Stack Overflow. Некоторые операционные системы могут предлагать другие API для выполнения таких задач (внедрение системных вызовов в ничего не подозревающие процессы).
Что касается вашей цели перемонтировать файловую систему из-под кого-то, то это по сути безнадежно, даже если вам технически удастся ее взломать — скорее всего, у процесса будут открытые файловые дескрипторы на «старом» монтировании, и нет переносимого способа правильно повторно прикрепить их к файлам на «новом» монтировании, даже если соответствующие файлы все еще там.
Подход, который, казалось бы, работает в теории, заключается в том, чтобы как бы перевести в спящий режим нужные вам процессы для этого обслуживания. Но с этим есть много проблем, особенно учитывая не просто файлы, а сетевые сокеты. (См.этот другой вопрос(для некоторых интересных моментов.)
Короче говоря, лучше действовать вежливо kill
(с льготным периодом), ведь никто не знает, какие неожиданные последствия могут возникнуть, если играть в игры со cwd
случайным процессом.
решение2
Процесс отвечает за управление своим текущим каталогом. Изменить его извне невозможно.
Вы можете схитрить, заставив процесс изменить свой собственный каталог. Если вы работаете как root или как тот же пользователь, что и процесс, вы можете использовать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