Q # 1
Why does the name of the script not show up when called through env?
Do artigo da wikipedia :
Under Unix-like operating systems, when a script with a shebang is run as a program, the program loader parses the rest of the script's initial line as an interpreter directive; the specified interpreter program is run instead, passing to it as an argument the path that was initially used when attempting to run the script.
Portanto, isso significa que o nome do script é conhecido pelo kernel como o nome do processo, mas imediatamente após ele ser chamado, o carregador então executa o argumento para #!
e passa o resto do script em como um argumento.
No entanto, env
não faz isso. Quando é chamado, o Kernel sabe o nome do script e, em seguida, executa env
. env
procura o $PATH
procurando o executável para exec.
É então env
que executa o interpretador. Não sabe nada do nome original do script, apenas o Kernel sabe disso. Neste ponto env
está analisando o restante do arquivo e passando para o interpretador que acabou de invocar.
Q # 2
Does pgrep simply parse the output of ps?
Sim, mais ou menos. Ele está chamando as mesmas bibliotecas C que o ps
está usando. Não é simplesmente um wrapper em torno de ps
.
Q # 3
Is there any way around this so that pgrep can show me scripts started via env?
Eu posso ver o nome do executável na saída ps
.
$ ps -eaf|grep 32405
saml 32405 24272 0 13:11 pts/27 00:00:00 bash ./foo.sh
saml 32440 32405 0 13:11 pts/27 00:00:00 sleep 1
Nesse caso, você pode usar pgrep -f <name>
para encontrar o executável, pois ele pesquisará todo o argumento da linha de comando, não apenas o executável.
$ pgrep -f foo
32405