SSH에서 "lsof"를 사용할 때 왜 작동하지 않습니까? [복사]

SSH에서 "lsof"를 사용할 때 왜 작동하지 않습니까? [복사]

이 명령줄이 작동하지 않는 것을 발견했습니다

ssh i01n10 "/usr/sbin/lsof -p $(pgrep -nf a.out)"

오류가 표시됩니다

lsof: 프로세스 ID가 지정되지 않았습니다.

하지만

ssh i01n10 "$(pgrep -nf a.out)"

PID를 올바르게 제공하십시오

lsofPID를 볼 수 없나요?

답변1

lsof쉘 확장으로 인해 이 명령은 PID를 볼 수 없습니다. 이는 $(pgrep -nf a.out)원격 서버가 아닌 로컬 서버에서 실행된다는 의미입니다 .

이러한 확장을 방지하려면 큰따옴표 대신 작은따옴표를 사용하십시오.

간단한 예:

$ foo=local
$ ssh debian8 "foo=remote; echo $foo"
local
$ ssh debian8 'foo=remote; echo $foo'
remote

명령 에 문제가 있을 수 있습니다 pgrep. 다음은 -of플래그 대신 사용한 간단한 테스트 입니다 -nf( -af플래그를 사용한 전체 명령 참조).

// on remote server
# sleep 200 &
[1] 27228
# exit
// on local host 
$ ssh debian8 'echo $(pgrep -nf sleep)'
27244 <-- not expected pid
$ ssh debian8 'echo $(pgrep -of sleep)'
27228 <-- this one

이는 자신을 일치 항목으로 보고하지 않지만 상위 쉘을 보고하는 $()하위 쉘을 효과적으로 시작합니다 . pgrep따라서 -n옵션을 사용하면 실제 pid가 아니라 pgrep자체 pid가 제공됩니다.

관련 정보