Existe alguma maneira de encontrar um processo (ou pelo menos a existência de um processo) pelo diretório de trabalho?

1

Eu sei que você pode encontrar o diretório de trabalho de um processo de algumas maneiras diferentes, mas existe alguma maneira de fazer o contrário? Eu tenho alguns aplicativos de servidor escritos em nó que infelizmente são difíceis de distinguir como processos (todos eles aparecem como node server.js em uma ps output) e eu gostaria de ter uma maneira simples de determinar se um servidor específico estava correndo.

Em outras palavras, a pergunta que preciso responder é; dado o diretório /x/y/z , existe um processo node server.js em execução com o diretório de trabalho /x/y/z ?

Atualmente, minha melhor tentativa é fazer ps -ef | grep "[n]ode server.js" , cortando o PID e fazendo um loop sobre eles, verificando pwdx para cada PID. Funciona, mas é complicado e eu queria saber se havia uma maneira melhor.

    
por Thor84no 29.03.2016 / 09:28

6 respostas

2

Como o pwdx aceita o PIDS, você pode usar:

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

E possivelmente defina uma função em seu .zshrc ou .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
}

}

    
por 29.03.2016 / 09:46
2

Eu só procuraria /proc .

Isso listará todos os seus pids para os quais você conhece o cwd e mostra o cwd ao lado dele:

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

Você pode grep ou inserir seu correspondente no loop:

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

que tal

pwdx 'pgrep "server.js"' 
    
por 29.03.2016 / 09:53
0

Você pode tentar isso, se você "nó" for o único processo

pwdx 'pidof node'
    
por 29.03.2016 / 09:56
0

Com base na resposta do @skwllsp, desenvolvi a seguinte função bash que resolve o problema:

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

Obrigado pela ajuda a todos!

    
por 29.03.2016 / 10:09
0

Os comandos fuser e lsof ambos os processos de lista que possuem um arquivo aberto. Neste contexto, ter um arquivo aberto inclui o diretório atual de um processo.

Com fuser , você só obtém IDs de processo, então você precisa chamar ps para obter o nome do comando.

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

Com lsof , você pode especificar que deseja apenas processos com o diretório atual (em oposição a, por exemplo, listar atualmente o conteúdo do diretório). Você pode obter o nome do comando com a saída c especificada, mas não os argumentos.

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