ssh targethost&;fg - 작동하지 않습니다. 그런데 왜 그럴까요?

ssh targethost&;fg - 작동하지 않습니다. 그런데 왜 그럴까요?

ssh 세션의 pid를 얻기 위해 다음 조합을 시도했습니다(백그라운드에서 실행하면 pid가 표시됨). 그런 다음 fg를 사용하여 ssh 세션으로 돌아가서 비밀번호를 입력했습니다.

ssh targetHost &; fg

다음 오류가 발생합니다.

-bash: syntax error near unexpected token `;'

이 경우 ";"가 예상대로 작동하지 않는 이유는 무엇입니까?

내 목표는 ssh 세션을 시작하고 해당 세션의 pid를 아는 것입니다. 가능한 한 적은 줄로 이 작업을 수행해야 합니다. 여러 SSH 세션을 시작하고 백그라운드에 두고 마지막으로 종료해야 합니다. 이것이 바로 pid가 필요한 이유입니다.

답변1

두 가지 상황을 혼동하고 있습니다.

  • foo ; barfoo를 실행하고 완료될 때까지 기다린 다음 bar를 실행합니다.
  • foo & barfoo를 시작하고 백그라운드에 넣은 다음 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

# 바라보다http://mywiki.wooledge.org/BashPitfalls

답변3

&;다른 사람들은 실패 이유를 설명했습니다 . 마지막 백그라운드 프로세스의 PID는 으로 저장되므로 $!언제든지 마지막 명령의 PID에 액세스할 수 있다는 점을 지적하고 싶습니다 .

ssh targetHost & echo $!; fg

세션을 종료하려면 다음 ssh을 사용하여 모든 세션을 종료할 수 있습니다.

pkill -x ssh

전체 명령 이름을 유발하고 일치시키면 x죽이지 않도록 보장됩니다. 특정 컴퓨터에 대한 연결만 종료하려는 경우 다음과 같이 할 수도 있습니다.pkillpgrepsshdssh-agent

pkill $(pgrep -alx ssh | grep TARGET_IP | cut -d ' ' -f 1)

관련 정보