Добавление страниц в терминальные приложения

Команда 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

0
06.06.2021, 11:51
1 ответ

То, о чем вы спрашиваете, называется буфером альтернативного экрана, и приложения переключаются на альтернативный экран и обратно, отправляя на терминал коды ESC.

Если ваше приложение использует библиотеку ncurses, для этого будут предусмотрены соответствующие функции. Если вы хотите сделать это из сценария оболочки, вы можете использовать tputдля отправки соответствующих кодов.

tput smcup  # switch to alt screen

tput rmcup  # switch back from alt screen

ПРИМЕЧАНИЕ. :большинство, но не все эмуляторы терминала поддерживают это. Те, у кого нет (или у которых он отключен, что является опцией в некоторых эмуляторах терминала ), просто игнорируют коды.

4
28.07.2021, 11:26

Теги

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