Grep по всем именам файлов в каталоге

Я хочу получить статус процесса для всех служб, работающих в данном каталоге. Прямо сейчас я могу проверить один за другим ps -ef | grep ServiceName, Но есть ли способ ls каталог и ps каждый сервис?

Что-то вроде ps -ef | grep < ls?

3 ответа

Решение

Уже опубликовано в качестве комментария, это должно делать то, что вы хотите:

ps -ef | grep "$(ls)"

В Баш:

ps -ef | grep "$(ls)"

(Та же самая строка появилась в комментарии incBrain, когда я составлял и тестировал оставшуюся часть моего ответа в Debian/Bash.)

Он будет генерировать мусор, если шаблон появляется в ps вывод в качестве аргумента командной строки (не команды) или как часть команды. Чтобы уменьшить это, я бы использовал find вместо ls чтобы получить полный путь:

ps -ef | grep -f <(find -L "$(pwd)" -maxdepth 1 -type f)

Тем не менее, могут быть некоторые нежелательные дополнительные результаты.

Обратите внимание, что это не

сервисы, работающие в данном каталоге

скорее процессы с исполняемыми файлами в данном каталоге.

Чтобы узнать текущую рабочую директорию процесса, вы можете прочитать /proc/<PID>/cwd, Следующий пример (быстрый и грязный) ps альтернатива, и это показывает, что вы можете извлечь информацию из /proc в форме, которую вы хотите:

sudo bash -c 'for i in /proc/[1-9]* ; do PID=$(basename "$i"); E=$(readlink "${i}/exe"); D=$(readlink "${i}/cwd"); echo -e "PID=${PID}\tEXE=${E}\tCWD=${D}" ; done | grep "CWD=$(pwd)$"'

Тебе нужно sudo получить доступ ко всем процессам. Если в этом нет необходимости, и вы хотите запустить его как обычный пользователь, часть внутри ' разделителей достаточно.

Может быть, что-то вроде этого:

processes="$(ps -ef)"
for file in *;do
  grep "$file" <<<"$processes"
done
Другие вопросы по тегам