Esse httpd.pl
é o nome do processo. Isso é inicializado a partir do nome base do arquivo que o processo executou pela última vez, mas também pode ser modificado por outros meios.
Com perl
, é apenas uma questão de atribuir um valor a $0
:
$ perl -e '$0 = "httpd.pl"; sleep 10' & ps -fp $!
[2] 11954
UID PID PPID C STIME TTY TIME CMD
stephane 11954 31685 0 09:57 pts/8 00:00:00 httpd.pl
Então, não há como dizer se httpd.pl
vem um arquivo chamado assim ou algo mais. perl
ainda poderia ter sido executado com o código passado como -e
ou de outro arquivo ou de stdin ...
Se o código perl foi carregado de um arquivo chamado httpd.pl
(ou qualquer outro arquivo que importe), provavelmente você não poderia dizer porque perl
geralmente fecha o arquivo depois de ter lido seu conteúdo, então seria não aparece na saída de lsof -p PID
.
Se o script foi realmente passado para o interpretador perl
e se o código perl não modificar subseqüentemente o nome do processo ou os argumentos, você poderá obter uma dica olhando seus argumentos de linha de comando com ps -fp PID
. / p>
Você então veria o caminho do arquivo como passado como argumento. Pode ser um caminho relativo, em cujo caso você pode ver a entrada cwd
em lsof
, o que ajudaria a menos que o script altere o diretório de trabalho atual.
Se o script foi iniciado por um shell, você também poderá encontrar o caminho (novamente possivelmente relativo) na variável de ambiente _
( grep -z '^_=' /proc/PID/environ
no Linux).
De qualquer forma, o script poderia ter sido deletado logo de início.
Se você quiser ver o código desse httpd.pl
, melhor seria despejar o conteúdo da memória desse processo (como com gcore
, enviado com gdb
ou olhando para /proc/PID/{maps,mem}
no Linux). E procure o código lá.
Por exemplo, procurando #!
em registros delimitados por NUL:
perl -e '$p=shift;open MAPS, "/proc/$p/maps";
open MEM, "/proc/$p/mem" or die "open mem: $!";
for $m (grep !m{/|\[v}, <MAPS>){
($a,$b) = map hex, $m =~ /[\da-f]+/g;
seek MEM, $a, 0 or die "seek: $!";
read MEM, $c, $b - $a or die "read: $!";
print $c
}' PID | grep -z '#!'
YYMV embora como o código-fonte bruto não pode mais estar lá. Você precisaria então procurar pelo código pré-compilado e decodificá-lo.
Esse stackoverflow Q & A então ajudará você a fazer isso.