私はそのプロセスを止めるいくつかの方法を知っています。私が入力したとき:
echo {1..999999} > filename.txt
私はそれが実行されるのを防ぐことはできません。Ctrl+ | + +などを使用してC他のプロセスを停止できます。しかし、それらのどれもこのコマンドを使用していないようです。CtrlDCtrl\
何人かの人々は私にこのターミナルを閉じるように言いました。さらに、新しい端末を開くと、すべての端末プロセスが終了しますが、そうしたくありません。サーバーでは、新しい端末を開く機会がないと思います。
テキストモードで新しい端末セッションを開くことはできますか?
答え1
Ctrlc現在、シェルはどのコマンドも実行していないため、-etc ...を使用して操作を中断することはできません。{1..999999}
コマンドが実行されているポイントに達すると、コマンドライン引数がどのようになるかを判断するために拡張します。
外部コマンドは終了シグナル(SIGINT
- を押すとデフォルトで実行されます)に応答しますが、シェル自体はそれを無視します。それ以外の場合 - を押すと、実行中のすべてのコマンドを終了するだけでなく、シェル自体も終了します。 (ttyジョブ制御とフォアグラウンドおよびバックグラウンドプロセスグループのため、これは完全には真実ではありませんが、説明目的のためには十分に似ています。)CtrlcCtrlc
これを中止する必要がある場合は、残念ながらシェル自体のみを終了できます。シェル自体を終了すると、セッションは終了します。この意味では、ターミナルウィンドウを閉じるかSSH接続を終了するのとほぼ同じです。
答え2
ctrl+で停止できる代替案が必要な場合は、cbashで次のことを行うことができます。
i=1; while [ $i -le 999999 ]; do echo $((i++)) >> filename.txt; done
リダイレクト記号を使用してください。1 >>
ファイルを上書きする代わりにファイルに追加します。
ctrlまた、括弧を使用してサブシェルでコマンドを実行すると+で停止できるようです。 Celadaで説明した理由により、出力ファイルは生成されません。c( echo {1..999999} > numero.txt )
バラよりサブシェル - Advanced Bash Scripting Guide
Celadaの答えをさらにサポートするために、bashシェルのフォークと実行シナリオの実行順序は次のとおりです。シェル拡張が完了するまでコマンドが実行されないことがわかります。コマンドでecho {1..999999} > filename.txt
親シェルはいシェル拡張プロセスが進行中です。ctrl+cもちろん、親シェルは終了しません。
入力がコメントアウトされていない場合、シェルは入力を読み取り、入力の各文字の意味を定義する引用規則を使用して単語と演算子に分割します。その後、これらの単語と演算子はコマンドやその他の構造に変換され、検査または処理に使用できる終了ステータスを返します。上記の分岐と実行方法は、シェルが次のように入力を解析した後にのみ適用されます。
シェルはファイル、文字列、またはユーザー端末から入力を読み込みます。
入力は、引用規則に従って単語と演算子に分類されます。第3章を参照してください。これらのタグはメタ文字で区切られます。エイリアス拡張を実行します。
シェルはトークンを単純コマンドと複合コマンドに解析(分析および置換)します。
Bashはさまざまなシェル拡張を実行して、拡張トークンをファイル名、コマンド、および引数のリストに分割します。
必要に応じてリダイレクトが実行され、リダイレクト演算子とそのオペランドがパラメータリストから削除されます。
コマンドが実行されます。
(オプション)シェルはコマンドが完了するのを待ち、終了ステータスを収集します。
コマンドがトークンに分割された後(セクション1.4.1.1を参照)、これらのトークンまたは単語は拡張または解析されます。 8つの拡張が行われ、次のセクションで拡張順序に従って説明します。
ブレーキ拡張は最初に拡張順序に従って行われる。
シェル拡張の停止
kill -SIGSTOP <pid>
実際にpidをシェルに送信すると、シェルの拡張を停止できます。echo $$
現在、シェルのpidを提供するか、pgrep -l bash
どのシェルが拡張を実行しているかを確認できます。
中断された部分から拡張を再開するために使用できますkill -SIGCONT <pid>
。
親シェルを終了または終了させる以外に拡張を終了する方法はありません。私にとって、これはサブシェルで拡張を実行する良い例です。