ssh
255 종료 상태를 리턴하는 것은 그 자체라는 가정 이 맞습니다. ssh
man 페이지는 말한다 :
ssh는 원격 명령의 종료 상태 또는 오류가 발생한 경우 255로 종료됩니다.
간단하게 실행했다면 ssh pi@10.20.0.10 "pkill -f asdf"
, " 일치하는 프로세스가 없습니다 "상태에 1
해당 하는 종료 상태가 나타납니다 .pkill
어려운 부분은 실행할 때 SSH에서 오류가 발생 하는 이유 를 이해 하는 것입니다
ssh pi@10.20.0.10 "pkill -f asdf || true"
SSH 원격 명령
SSH 서버는 셸을 시작하여 원격 명령을 실행합니다. 다음은 이에 대한 예입니다.
$ ssh server "ps -elf | tail -5"
4 S root 35323 1024 12 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony [priv]
5 S anthony 35329 35323 0 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony@notty
0 S anthony 35330 35329 0 80 0 - 28283 do_wai 12:01 ? 00:00:00 bash -c ps -elf | tail -5
0 R anthony 35341 35330 0 80 0 - 40340 - 12:01 ? 00:00:00 ps -elf
0 S anthony 35342 35330 0 80 0 - 26985 pipe_w 12:01 ? 00:00:00 tail -5
기본 쉘은 bash
원격 명령이며 단순한 명령이 아니라 파이프 라인 ( 제어 연산자로 구분 된 하나 이상의 명령 시퀀스)입니다 |
.
Bash 쉘은 -c
옵션에 의해 전달되는 명령이 간단한 명령 인 경우 실제로 새 프로세스를 분기하지 않고 (예 : exec
추가 단계를 거치지 않고 직접 간단한 명령을 수행하여) 최적화 할 수 있음을 알기에 충분히 영리 합니다. 의 fork
는 전에 보내고 exec
이야. 다음은 원격 단순 명령 ( ps -elf
이 경우) 을 실행할 때 발생하는 예입니다 .
$ ssh server "ps -elf" | tail -5
1 S root 34740 2 0 80 0 - 0 worker 11:49 ? 00:00:00 [kworker/0:1]
1 S root 34762 2 0 80 0 - 0 worker 11:50 ? 00:00:00 [kworker/0:3]
4 S root 34824 1024 31 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony [priv]
5 S anthony 34829 34824 0 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony@notty
0 R anthony 34830 34829 0 80 0 - 40340 - 11:51 ? 00:00:00 ps -elf
이전 에이 동작을 보았지만 이 AskUbuntu answer 이외의 더 나은 참조를 찾을 수 없었습니다 .
pkill behavior
때문에 pkill -f asdf || true
간단한 명령 (그것은이다 아닌 명령 목록 )을 실행할 때, 위의 최적화는 그렇게 발생하지 않을 수 ssh pi@10.20.0.10 "pkill -f asdf || true"
의 sshd
프로세스 포크와 임원을 bash -c "pkill -f asdf || true"
.
ctx의 답변이 지적했듯이 pkill
자체 프로세스는 종료하지 않습니다. 그러나, 그것은 것입니다 누구의 명령 라인과 일치하는 다른 프로세스 죽이기 -f
패턴. 이 bash -c
명령은이 패턴과 일치하므로이 프로세스 (자체의 부모)가 종료됩니다.
그런 다음 SSH 서버는 원격 명령을 실행하기 위해 시작한 쉘 프로세스가 예기치 않게 종료 된 것을 확인하여 SSH 클라이언트에 오류를보고합니다.
pkill
의 인수 목록은 정규 표현식을 일치하기 때문에 부모 쉘 프로세스를 종료를, 나는 용어 이의를 제기 할 수 있습니다 :x || y
입니다 하지 복합 명령 , 그것은의 명령 목록 .