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

2つの状況を混同しています。

  • 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

&;いつも間違っています。簡潔な1行の方法でバックグラウンドで何かを実行するには、 ";"を完全に省略し、&コマンド間で簡単に使用します。

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)

関連情報