Команда jobs
может показывать рабочий каталог, в котором программа запущена ,если этот каталог отличается от текущего каталога оболочки. Это потому, что оболочка отслеживает то, что ей известно (, где начался процесс ), а не текущее состояние.
Это также зависит от оболочки.
например, сbash
bash-4.4$ cd /tmp
bash-4.4$ sleep 1000 &
[1] 24807
bash-4.4$ jobs -l
[1]+ 24807 Running sleep 1000 &
bash-4.4$ cd /
bash-4.4$ jobs -l
[1]+ 24807 Running sleep 1000 & (wd: /tmp)
Но ksh93
этого не происходит
$ sleep 1000 &
[1] 7164
$ jobs -l
[1] + 7164 Running sleep 1000 &
$ cd /
$ jobs -l
[1] + 7164 Running sleep 1000 &
$
Я не верю, что существует переносимый способ найти cwd процесса. fstat
, pwdx
и подобные могут помочь. Вам могут понадобиться привилегии root
для просмотра процессов, которыми вы не владеете.
В Linux процессы, соответствующие определенному пути, можно использовать, просматривая символическую ссылку /proc/.../cwd
:
например, чтобы найти процессы с /tmp
в пути:
% sudo ls -l /proc/*/cwd | grep /tmp
lrwxrwxrwx. 1 sweh sweh 0 Jul 28 09:38 /proc/23435/cwd -> /news/tmp
lrwxrwxrwx. 1 sweh sweh 0 Jul 28 09:39 /proc/7124/cwd -> /news/tmp
Помните, что это может не совпадать с внутренним представлением каталога процесса из-за символических ссылок:
$ cd /usr/tmp
$ pwd
/usr/tmp
$ ls -l /proc/self/cwd
lrwxrwxrwx. 1 sweh sweh 0 Jul 28 09:41 /proc/self/cwd -> /var/tmp/
$ ls -l /usr/tmp
lrwxrwxrwx 1 root root 10 May 13 09:39 /usr/tmp ->../var/tmp/
$
Здесь оболочка думает, что я нахожусь в /usr/tmp
, но на самом деле это /var/tmp
.
ИЗМЕНИТЬ, ЧТОБЫ ДОБАВИТЬ:
Существует особый случай этой проблемы, когда вопрос может заключаться в том, "какие процессы используют точку монтирования". Это не отчет cwd
, а любые файлы, которые могут быть открыты.
Так, например:
$ sudo fuser -u -c /brick
/brick: 3552(root)
$ ps -p 3552
PID TTY TIME CMD
3552 ? 00:04:51 glusterfsd
$
Мы знаем, что процесс glusterfsd
— единственный, использующий файловую систему /brick
То, о чем вы спрашиваете, называется буфером альтернативного экрана, и приложения переключаются на альтернативный экран и обратно, отправляя на терминал коды ESC.
Если ваше приложение использует библиотеку ncurses, для этого будут предусмотрены соответствующие функции. Если вы хотите сделать это из сценария оболочки, вы можете использовать tput
для отправки соответствующих кодов.
tput smcup # switch to alt screen
tput rmcup # switch back from alt screen
ПРИМЕЧАНИЕ. :большинство, но не все эмуляторы терминала поддерживают это. Те, у кого нет (или у которых он отключен, что является опцией в некоторых эмуляторах терминала ), просто игнорируют коды.