sshセッションのpidを取得するために、次の組み合わせを試しました(バックグラウンドで実行するとpidが表示されます)。その後、fgを使用してsshセッションに戻り、パスワードを入力しました。
ssh targetHost &; fg
次のエラーが発生します。
-bash: syntax error near unexpected token `;'
この場合、「;」が期待どおりに機能しないのはなぜですか?
私の目標は、sshセッションを開始し、そのセッションのpidを知ることです。できるだけ少ない行でこれを行う必要があります。複数のSSHセッションを開始し、バックグラウンドに置き、最後に終了する必要があります。これがpidが必要な理由です。
答え1
2つの状況を混同しています。
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
&;
いつも間違っています。簡潔な1行の方法でバックグラウンドで何かを実行するには、 ";"を完全に省略し、&
コマンド間で簡単に使用します。
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)