Получить PID процесса отправки канала

Вы можете продолжать свой подход, если Вам так нравится.
Конечно, вы можете выполнять несколько команд для каждого совпадения и сопоставлять разные строки с различной последовательностью команд (, а также можете совместно использовать некоторые команды для разных типов строк, в то же время запуская более конкретные команды ).
Экс:

tail -f /mnt/zandrologs/* | awk '
/GRRFIELD/{ system("echo \"test\""); system("echo \"testG\""); }
/FRRFIELD/{ system("echo \"test2\""); system("echo \"testF\""); }
/FIELD/{ system("echo \"shared command for all lines containing FIELD\"");}'

Вы также можете опустить символы новой строки и заменить их пробелами, если хотите. Также вы можете выполнить более сложное сопоставление -, и если вы когда-либо сопоставляете только $0 (всю строку ), как в вашем примере, я бы рекомендовал использовать awk в фиксированных полях с режимом, чтобы избежать накладных расходов на разделение строки в поля.

0
12.11.2020, 00:33
2 ответа

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

Предположим, что receiverимеет pid 1730. Он мог бы просмотреть/proc/self/fd/0(или, проще говоря,/proc/self/fd/0)и увидеть, что он отображается как символическая ссылка на pipe:[43270]. /proc/1730/fdinfo/0. Затем он может обнаружить, что /proc/1729/fd/1отображается как символическая ссылка на pipe:[43270], а на /proc/1729/fdinfo/1он имеет флаги 01. Таким образом, он нашел процесс, удерживающий другой конец трубы.

Обратите внимание:

  • это специфический для Linux -подход, не -переносимый и неэффективный
  • несколько процессов могут иметь возможность записи в этот канал (также, запись вообще не обязательно должна быть в fd 1)
  • склонен к гонкам
  • Если any-processпринадлежит другому пользователю, receiverне сможет просматривать свои файловые дескрипторы

Если вы хотите, чтобы два процесса взаимодействовали аутентифицированным способом, вам следует использовать сокет unix. Через них можно с помощью опции SO_PASSCREDиспользовать вспомогательное сообщение типа SCM_CREDENTIALSс pid, uid и gid отправителя. Учетные данные, которые указывает отправитель, проверяются ядром, чтобы гарантировать, что они не могут лгать (, если у него нет соответствующих возможностей, корневой процесс / CAP _SYS _ADMIN мог бы указать идентификатор процесса, отличный от его собственного ).

1
18.03.2021, 22:50

Простой способ может быть достигнут путем перенаправления исполняемого процесса на файловый дескриптор 3, вот пример команды sleep , которая передается в команду ps :

( sleep 100 & echo $!>&3 ) 3>pid | ps -p "$(<pid)"

Вы можете проверить процесс выполнения команды sleep:

ps -p $(<pid)
0
18.03.2021, 22:50

Теги

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