Intereting Posts
Где во время загрузки загружаются возможности iptables и переадресация ip для перехода на другой ресурс Как удалить новые строки из ip в качестве вывода? Почему cron перестала обрабатывать команды? Рекомендация Linux для старого ноутбука Bash: double равно vs -eq CronJob каждые 25 минут Не удается исключить пользователя в директиве match в конфигурации SSHD Httpd: на устройстве нет места PIP сохраняет день на Fedora 25 для No module с именем «PyQt5.QtWebEngineWidgets» ошибка..WHY? Установка php5-cURL в Backtrack приводит к проблемам с зависимостями Почему запрос xrandr ненадолго замораживает экран? Есть ли способ уменьшить яркость экрана или изменить его цвета при использовании драйвера SCFB на FreeBSD? H2O Webserver – Несколько доменов – возможно? Или текущая версия предназначена только для одного домена? Аккумулятор ноутбука не поднимает с 59% (т.е. показывает неправильную статистику батареи)

Есть ли способ найти процесс (или, по крайней мере, существование процесса) с помощью рабочего каталога?

Я знаю, что вы можете найти рабочий каталог процесса несколькими разными способами, но есть ли способ сделать обратное? У меня есть некоторые серверные приложения, написанные на узле, которые, к сожалению, сложны, чтобы отличать друг от друга как процессы (все они отображаются как node server.js в выводе ps ), и я хотел бы иметь простой способ определить, был ли конкретный сервер Бег.

Другими словами, мне нужен ответ; данный каталог /x/y/z , существует node server.js процесс node server.js с рабочим каталогом /x/y/z ?

В настоящее время моя лучшая попытка – ps -ef | grep "[n]ode server.js" ps -ef | grep "[n]ode server.js" , разрезая PID и перебирая их, проверяя pwdx для каждого PID. Это работает, но это громоздко, и мне было интересно, есть ли лучший способ.

Поскольку pwdx принимает PIDS, вы можете использовать:

 $ pwdx $(ps -C "node server.js" --format pid --no-headers) 2781: /home/user 4405: /home/user/src.git/ 

И, возможно, определите функцию в ваших .zshrc или .bashrc:

 function select_by_dir() { if (( $# == 0))l then pwdx $(ps -C "node server.js" --format pid --no-headers) else pwdx $(ps -C "node server.js" --format pid --no-headers) | grep $1 fi } 

}

Я просто ищу /proc .

В этом списке будут перечислены все ваши сообщения, для которых вы знаете, cwd и показать cwd рядом с ним:

 (cd /proc/; for p in [0-9]*; do cwd="$(readlink "$p/cwd")" || continue; echo "$p $cwd"; done) 

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

 (cd /proc/; for p in [0-9]*; do cwd="$(readlink "$p/cwd")" || continue; [ "$cwd" != "$THE_CWD_IM_LOOKING_FOR" ] || { echo "$p"; break; } done) 

как насчет

 pwdx `pgrep "server.js"` 

Вы можете попробовать это, если «узел» является единственным процессом

 pwdx `pidof node` 

Основываясь на ответе от @skwllsp, я придумал следующую функцию bash, которая решает проблему:

 function is-server-running { local path=$(realpath "${1-.}") pwdx $(ps -C "node server.js" --format pid --no-headers) | grep --silent "$path" } 

Спасибо всем за помощь!

Команды fuser и lsof оба перечисляют процессы, у которых файл открыт. В этом контексте наличие открытого файла включает текущий каталог процесса.

С помощью fuser вы получаете только идентификаторы процессов, поэтому вам нужно вызвать ps чтобы получить имя команды.

 pids=$(fuser -s /x/y/z 2>/dev/null | tr ' ' ',') pids=${pids#,} node_pids=$(ps -p "$pids" -o pid=,args= | awk '$2 == "node" && $3 == "server.js" {print $1}') kill $node_pids 

С помощью lsof вы можете указать, что вам нужны только процессы с этим текущим каталогом (в отличие от, например, в настоящее время перечисления содержимого каталога). Вы можете получить имя команды с указанным результатом c , но не аргументы.

 pids=$(lsof -F p -a -d cwd . | sed '1s/^p//; s/p/,/' | tr -d \\n)