ssh 세션의 pid를 얻기 위해 다음 조합을 시도했습니다(백그라운드에서 실행하면 pid가 표시됨). 그런 다음 fg를 사용하여 ssh 세션으로 돌아가서 비밀번호를 입력했습니다.
ssh targetHost &; fg
다음 오류가 발생합니다.
-bash: syntax error near unexpected token `;'
이 경우 ";"가 예상대로 작동하지 않는 이유는 무엇입니까?
내 목표는 ssh 세션을 시작하고 해당 세션의 pid를 아는 것입니다. 가능한 한 적은 줄로 이 작업을 수행해야 합니다. 여러 SSH 세션을 시작하고 백그라운드에 두고 마지막으로 종료해야 합니다. 이것이 바로 pid가 필요한 이유입니다.
답변1
두 가지 상황을 혼동하고 있습니다.
foo ; bar
foo를 실행하고 완료될 때까지 기다린 다음 bar를 실행합니다.foo & bar
foo를 시작하고 백그라운드에 넣은 다음 bar를 직접 시작합니다.
둘 중 하나를 사용할지 여부를 결정해야 합니다. 두 가지 방법을 모두 가질 수는 없습니다. ;)
문제를 해결하려면 백그라운드에서 모든 작업을 실행하고 다음 job
을 사용하여 pid를 나열하면 됩니다.
michas@lenny:~$ sleep 10 &
[1] 18007
michas@lenny:~$ sleep 10 &
[2] 18011
michas@lenny:~$ sleep 10 &
[3] 18015
michas@lenny:~$ sleep 10 &
[4] 18019
michas@lenny:~$ sleep 10 &
[5] 18026
michas@lenny:~$ jobs -p
18007
18011
18015
18019
18026
michas@lenny:~$
또한 종료 신호를 보내는 데 반드시 pid가 필요한 것은 아닙니다. 예를 들어 kill %1
첫 번째 백그라운드 프로세스가 종료됩니다.
답변2
&;
항상 틀렸어요. 간결한 한 줄 방식으로 백그라운드에서 무언가를 실행하려면 ";"을 완전히 생략하고 &
명령 사이에 간단히 사용하세요.
for i in ./*; do my_command "$i" & done
답변3
&;
다른 사람들은 실패 이유를 설명했습니다 . 마지막 백그라운드 프로세스의 PID는 으로 저장되므로 $!
언제든지 마지막 명령의 PID에 액세스할 수 있다는 점을 지적하고 싶습니다 .
ssh targetHost & echo $!; fg
세션을 종료하려면 다음 ssh
을 사용하여 모든 세션을 종료할 수 있습니다.
pkill -x ssh
전체 명령 이름을 유발하고 일치시키면 x
죽이지 않도록 보장됩니다. 특정 컴퓨터에 대한 연결만 종료하려는 경우 다음과 같이 할 수도 있습니다.pkill
pgrep
sshd
ssh-agent
pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)