Не существует переносимого способа сделать это с помощью 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
Попробуйте выполнить конвейерную обработку с помощью команды compgen