![SSH에서 "lsof"를 사용할 때 왜 작동하지 않습니까? [복사]](https://linux55.com/image/6427/SSH%EC%97%90%EC%84%9C%20%22lsof%22%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EC%99%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
이 명령줄이 작동하지 않는 것을 발견했습니다
ssh i01n10 "/usr/sbin/lsof -p $(pgrep -nf a.out)"
오류가 표시됩니다
lsof: 프로세스 ID가 지정되지 않았습니다.
하지만
ssh i01n10 "$(pgrep -nf a.out)"
PID를 올바르게 제공하십시오
왜 lsof
PID를 볼 수 없나요?
답변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가 제공됩니다.