$PID/cwd '/proc/': существует ли эквивалентный POSIX?

Вопрос был решен. Appearently LC_ALL=C недостаточно. Я должен записать export LC_ALL=C чтобы быть распознанным sort. Это - мое плохое, но должно быть известно будущими unicode-сортировщиками

8
08.07.2014, 16:54
3 ответа

POSIX мало что предлагает в плане получения информации о несвязанных процессах. На самом деле есть только ps, и он не дает никакой информации о текущем каталоге. API-интерфейсы на C-уровне не лучше (на самом деле большая часть информации, получаемой с помощью ps, может быть получена только путем разбора его вывода¹).

Как ни странно, но POSIX предлагает портативный путь наоборот: получив файл, вы можете узнать, какие процессы открыли его, позвонив в fuser. Следующий сниппет перечисляет PID процессов, имеющих определенный рабочий каталог:

fuser -f "$directory_name" 2>&1 | sed -e '$!d' -e 's/.*://' -e 's/  */\
/' | sed -n 's/c$//p'

Если вам нужна информация о процессах таким образом, чтобы ее можно было переносить на практике, используйте lsof. Автор lsof проделал работу по реализации всех различных способов получения информации о различных вариантах unix.

Для случайного просмотра:

lsof -a -p "$pid" -d cwd

Для автоматического разбора:

lsof -a -p "$pid" -d cwd -F n | sed -e '1d' -e '2s/^n//'

Обратите внимание, что lsof заменяет новые строки строкой \n.

Некоторые варианты Unix предлагают методы, не требующие программного обеспечения сторонних разработчиков, но эти методы будут иметь силу, характерную для каждого варианта. Очень похожее замечание см. в Портативность ссылок на файловые дескрипторы

¹ Некоторые старые юникс имеют ps корень сетуида и чтение памяти ядра, поэтому использование этого двоичного сетуида было единственным способом получения этой информации.

5
27.01.2020, 20:11
[

] У меня есть решение, использующее []lsof[]. По умолчанию оно не установлено на BSD, поэтому, если кто-то хочет использовать его на BSD, необходимо его установить.[

] [

]Сделайте скрипт оболочки:[

] [
#!/bin/sh
lsof -p $1 | grep cwd | awk '{print $9}'
] [

]Скопируйте его в каталог по вашему пути. Он распечатает рабочую директорию PID, указанную в первом аргументе, т.е.[

] [
$ script 1987
/home/enedil
]
6
27.01.2020, 20:11

Я внесу свой вклад в ответ.

Опция, в контексте интерактивной оболочки (вопрос фокусируется на этом контексте), может автоматически поддерживать ссылку а-ля /proc/$PID/cwd, используя возможность автоматизации Bash предоставляет:

PROMPT_COMMAND="ln -sfT \$(pwd) ~/$LINK_NAME"

Опция f необходима, так как ссылка будет часто переопределяться. Необходима опция T, так как в противном случае опция f работает правильно.

Оболочка может быть сделана кооперативной, используя это в примере, ~/.bashrc:

if [ -v CWD_LINK_NAME ]; then
   PROMPT_COMMAND='ln -sfT "$(pwd)" "'$CWD_LINK_NAME'";'$PROMPT_COMMAND
   declare -r CWD_LINK_NAME
   function rm_cwd_link() {
      rm "$CWD_LINK_NAME"
   }
   trap rm_cwd_link EXIT
fi

Оболочка или терминал может быть выполнен с CWD_LINK_NAME, установленным на любое соответствующее значение. Ex. CWD_LINK_NAME="~/$SOME_ROLE_NAME" гном-терминал

Другой альтернативой является использование той же самой концепции для отслеживания рабочего каталога груши в переменной, это отслеживание основано на обоих вкладах @Gilles и @enedil:

PROMPT_COMMAND="PEAR_WD=\$(lsof -p $PID | awk '/cwd/{print \$9}')"

Однако, это менее точный и менее удобный способ, в то время как для редких случаев $PROMPT_COMMAND не может быть установлен в другой оболочке.

Я за первый вариант (все еще жду, прежде чем выбрать ответ, если когда-нибудь появятся другие варианты).

0
27.01.2020, 20:11

Теги

Похожие вопросы