SSH 대상 호스트 &; fg - 작동하지 않지만 왜 그렇습니까?

SSH 대상 호스트 &; 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를 시작하고, 백그라운드에 두고 바로 이어서 시작 표시줄을 시작합니다.

둘 중 하나를 사용할지 결정해야 합니다. 둘 다 할 수는 없습니다. ;)

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)

관련 정보