26

bashスクリプトでは、sshを介してリモートマシンでコマンドを実行します。ユーザーがCtrl+Cを押してスクリプトを中断すると、スクリプトが停止するだけで、sshクライアントも停止しません。さらに、sshクライアントを強制終了しても、リモートコマンドは実行されています...

Crtl + cでローカルのsshクライアントとリモートコマンドの呼び出しを強制終了するbashを作成するにはどうすればよいですか?

簡単なスクリプト:

#/bin/bash
ssh -n -x root@db-host 'mysqldump db' -r file.sql
4

5 に答える 5

24

最終的に私はそのような解決策を見つけました:

#/bin/bash
ssh -t -x root@db-host 'mysqldump db' -r file.sql

つまり、「-n」の代わりに「-t」を使用します。'-n'を削除するか、rootとは異なるユーザーを使用しても効果はありません。

于 2008-12-03T13:17:34.170 に答える
4

ssh セッションが終了すると、シェルは SIGHUP を受け取ります。(電話を切る信号)。そこから開始されたすべてのプロセスにそれを送信することを確認する必要があります。bash の場合は、 を試してくださいshopt -s huponexit; your_command。man ページには huponexit は対話型シェルでのみ機能すると書かれているため、これは機能しない可能性があります。

私のクラスターでジョブを実行しているユーザーと、nohup を使用する必要があるかどうか (必要な動作とは逆の動作を得るために) でこれに遭遇したことを覚えていますが、子プロセスが無視するかどうかについて、bash の man ページには何も見つかりませんデフォルトではSIGHUP。うまくいけば、huponexit がそのトリックを実行します。(コマンドラインではなく、.bashrcにそのshoptを入れることができると思います。)

ssh -tただし、接続が閉じられると、端末からの読み取りで EOF またはエラーが発生し、ほとんどのプログラムが終了するため、機能するはずです。

于 2009-12-09T20:32:28.647 に答える
2

ssh に渡すオプションが何をするか知っていますか? 私はそうではないと思います。-n オプションは /dev/null からの入力をリダイレクトするため、リモート ホストで実行しているプロセスは、Ctrl-C からの SIGINT を認識していない可能性があります。

ここで、リモート ルート ログインを許可することがいかに悪い考えであるかについて話しましょう。

それは本当に、本当に悪い考えです。HOWTO: setup ssh keysを参照して、ssh 経由でリモート プロセスの実行を安全に管理する方法をいくつか提案してください。リモートで特権を使用して何かを実行する必要がある場合は、コマンドが埋め込まれた ssh 公開キーと、sudo の厚意により root として実行されるスクリプトを含むソリューションが必要になるでしょう。

于 2008-12-02T15:53:07.040 に答える
1
trap "some_command" SIGINT

some_commandCtrl+C を押すとローカルで実行されます。help trap他のオプションについて説明します。

この問題に関してssh、私はsshについてあまり知りません。リモートコマンドを強制終了するssh -n -x root@db-host 'killall mysqldump'代わりに、呼び出しを行うことができますか?some_command

于 2008-12-01T18:05:52.123 に答える