Что-то должно быть настроено для пересылки пакетов из сети A в сеть B. Loki, будучи двойным узлом, мог это сделать, но это не происходит автоматически. При этом вы настроите Loki в качестве маршрутизатора и должны использовать Loki в качестве шлюза по умолчанию для хоста B. Другой вариант - установить постоянный маршрут в таблице маршрутизации хоста B, указав Loki в качестве пункта назначения для трафика 10.xxx. .
Рабочие каталоги процессов известны другим процессам во многих операционных системах. Их можно запрашивать из ядра в 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
, не обязательно надежен.
Наконец, :обратите внимание, что текущий каталог процесса не обязательно является рабочим каталогом, который был у него при порождении процесса, а это все, что на самом деле выполняет оболочка управления заданиями знать.
Не существует переносимого способа сделать это с помощью 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
Команда 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