¿Hay alguna manera de encontrar un process (o al less la existencia de un process) por el directory de trabajo?

Sé que puede encontrar el directory de trabajo de un process de diferentes maneras, pero ¿hay alguna forma de hacerlo al revés? Tengo algunas aplicaciones de server escritas en un nodo que desafortunadamente son difíciles de diferenciar como processs (todas se muestran como node server.js en una salida de ps ) y me gustaría tener una manera simple de determinar si un server específico era o no corriendo.

En otras palabras, la pregunta que necesito responder es; dado el directory /x/y/z , ¿hay un process de node server.js ejecutándose con el directory de trabajo /x/y/z ?

Actualmente mi mejor bash es hacer ps -ef | grep "[n]ode server.js" ps -ef | grep "[n]ode server.js" , cortando el PID y volteando sobre ellos, comprobando pwdx para cada PID. Funciona, pero es engorroso y me preguntaba si habría una mejor manera.

Como pwdx acepta PIDS, puede usar:

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

Y posiblemente defina una function en su .zshrc o .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 } 

}

Solo searchía /proc .

Esto mostrará una list de todos tus pids para los que conoces el cwd y muestra el cwd al lado:

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

Puedes grep o insert tu matcher directamente en el bucle:

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

qué tal si

 pwdx `pgrep "server.js"` 

Puedes intentar esto, si tu "nodo" es el único process

 pwdx `pidof node` 

Basado en la respuesta de @skwllsp, he encontrado la siguiente function bash que resuelve el problema:

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

Gracias por ayudar a todos!

Los commands fuser y lsof muestran los processs que tienen un file abierto. En este context, tener un file abierto incluye el directory actual de un process.

Con fuser , solo obtiene ID de process, por lo que debe llamar a ps para get el nombre del command.

 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 

Con lsof , puede especificar que solo desea processs con ese directory actual (en lugar de, por ejemplo, actualmente enumerar los contenidos del directory). Puede get el nombre del command con la salida c especificada, pero no los arguments.

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