Как проверить, запущен ли в процессе сценарий оболочки?

Что-то должно быть настроено для пересылки пакетов из сети A в сеть B. Loki, будучи двойным узлом, мог это сделать, но это не происходит автоматически. При этом вы настроите Loki в качестве маршрутизатора и должны использовать Loki в качестве шлюза по умолчанию для хоста B. Другой вариант - установить постоянный маршрут в таблице маршрутизации хоста B, указав Loki в качестве пункта назначения для трафика 10.xxx. .

0
30.07.2018, 23:12
3 ответа

Рабочие каталоги процессов известны другим процессам во многих операционных системах. Их можно запрашивать из ядра в BSD и Linux, используя sysctl()и procfsсоответственно. Однако ни команда Linux psиз procps, ни команды psв BSD не получают и не сообщают эту информацию.

Для получения текущего каталога процесса на BSD используется команда fstat, которая сообщает файловую систему и номер узла i -.

% fstat -p $$|awk '{ if ("wd" == $4 || 1 == NR) print; }'
USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
JdeBP    zsh        71512   wd /usr/home/JdeBP      4 drwxr-xr-x     127  r
% 

Обратите внимание, что, конечно, рабочие каталоги могут быть доступны по нескольким именам, и эти имена могут меняться по мере переименования вещей и создания/удаления ссылок. Стабильная их часть — это файловый объект, vnode, а не записи каталога для доступа к нему.

Таким образом, механизм Linux, сообщающий об одном имени в /proc/pid/cwd, не обязательно надежен.

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

Дополнительная литература

1
28.01.2020, 02:31

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

Начнем с pwdx, которая выводит текущий рабочий каталог процесса.

Запуск от имени пользователя root:

for i in $(ps aux | awk '{print $2}'); do pwdx $i; done

ps aux | awk '{print $2}'выводит pid для каждого процесса.

pwdx $iПередает переменную i, которая является pid, вpwdx

Вы можете использовать pwdxдля самого pid, но цикл for выполняет их все вместе.

Вы также можете использовать lsof, но вам может потребоваться сначала установить пакет lsofв зависимости от вашей системы. Запуск от root:

for i in $(ps aux | awk '{print $2}'); do lsof -p $i | grep cwd; done

ps aux | awk '{print $2}'выводит PID для каждого процесса.

lsof -p $iПередает переменную i вlsof

grep cwdПечатает строки, содержащие cwdили текущий рабочий каталог.

Что касается команды pgrep, вы можете использовать ее в форме:

pgrep <process-name>

, чтобы также найти pid процесса, но вам все равно придется передать его либо lsof, либо pwdx, чтобы найти текущий рабочий каталог.

Первый for loopработает с Fedora 28, Centos 7.5, RHEL 7.5 и Debian 9, но не с FreeBSD 11.

Второй for loopработает с Fedora 28, Centos 7.5, RHEL 7.5 и Debian 9. Он также работает с FreeBSD 11.1, хотя в моем случае он выводит предупреждающие сообщения о том, что версия lsofпредназначена для FreeBSD 11, а у меня FreeBSD 11.1

0
28.01.2020, 02:31

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

3
28.01.2020, 02:31

Теги

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