タグ付けされた質問 「signals」

シグナルは、実行中のプロセスに送信できるメッセージです。シグナルは、プログラム、ユーザー、または管理者が開始できます。

3
信号は内部的にどのように機能しますか?
一般に、プロセスを強制終了するにはSIGKILL、SIGTSTPなどのシグナルを生成します。 しかし、特定のシグナルを注文した人、特定のプロセスに送信した人、一般的にシグナルがどのように操作を実行するのかはどのように知られていますか?信号は内部的にどのように機能しますか?

4
Bashで遅延サスペンド(Ctrl-Y)の目的は何ですか?
Bashのマニュアルページの該当部分のみに次のように記載されています。 bashが実行されているオペレーティングシステムがジョブ制御をサポートしている場合、bashにはそれを使用する機能が含まれています。プロセスの実行中に中断文字(通常^ Z、Control-Z)を入力すると、そのプロセスが停止し、制御がbashに戻ります。 遅延サスペンド文字(通常^ Y、Control-Y)を入力すると、端末から入力を読み取ろうとするとプロセスが停止し、制御がbashに戻ります。 その後、ユーザーはbg コマンドを使用してバックグラウンドでジョブを続行し、このジョブの状態を操作できます。fgフォアグラウンドでそれを続行するコマンド、またはそれを強制終了するkillコマンド。^ Zはすぐに有効になり、保留中の出力と先行入力が破棄されるという追加の副作用があります。 私は一度も使用したことがありませんCtrl- Y; 私はそれについて学んだだけです。私は罰金を行っているCtrl- Z(一時停止)のみ。 私は、このオプションが何であるかを想像しようとしていますのために。いつ役に立つでしょうか? (この機能はすべてのUnixバリアントに存在するわけではありません。SolarisおよびFreeBSDには存在しますが、Linuxには存在しません。対応する設定はstty dsuspです。) おそらく少ない主観:で実現することができるものありますCtrl- Yと同じように簡単に行うことができませんかCtrl- Z?


2
シグナルがキャッチされたときのシステムコールの中断
read()とのwrite()呼び出しのマニュアルページを読むと、これらの呼び出しは、ブロックする必要があるかどうかに関係なく、シグナルによって中断されるようです。 特に、仮定 プロセスが何らかのシグナルのハンドラーを確立します。 デバイスが設定されてO_NONBLOCK いない状態で開かれている(つまり、ブロッキングモードで動作している) その後、プロセスread()はデバイスから読み取るシステムコールを行い、その結果、カーネル空間でカーネル制御パスを実行します。 read()プロセスがカーネル空間で実行している間、ハンドラーが以前にインストールされたシグナルがそのプロセスに配信され、そのシグナルハンドラーが呼び出されます。 SUSv3の「System Interfaces volume(XSH)」のマニュアルページと適切なセクションを読むと、次のことがわかります。 私。a read()がデータを読み込む前に信号によって中断された場合(つまり、データが利用できなかったためブロックしなければならなかった場合)、errno[EINTR]に設定された-1を返します。 ii。a read()がデータを正常に読み取った後(つまり、要求の処理をすぐに開始できた)にシグナルによって中断された場合、読み取られたバイト数を返します。 質問A): どちらの場合(ブロック/ブロックなし)でも、信号の配信と処理は完全に透過的ではないと仮定するのは正しいread()ですか? ケースi。ブロッキングread()は通常、プロセスをTASK_INTERRUPTIBLE状態にするため、シグナルが配信されるとカーネルがプロセスをTASK_RUNNING状態にするため、理解できるようです。 しかし、read()ブロックする必要がなく(ケースii。)、カーネル空間でリクエストを処理している場合、シグナルの到着とその処理は、ハードウェアの到着と適切な処理と同様に透過的であると考えていました。割り込みになります。特に、シグナルの配信時に、プロセスは一時的にユーザーモードになり、そのシグナルハンドラーを実行して、最終的に戻り、中断されたread()(カーネルスペースで)処理を終了しread()て、完了までの経過後、プロセスはread()(ユーザー空間での)呼び出しの直後のポイントに戻り、結果として利用可能なすべてのバイトが読み込まれます。 しかし、ii。はread()、データがすぐに利用可能であるため、が中断されていることを暗示しているように見えますが、(すべてではなく)一部のデータのみを返します。 これにより、2番目の(そして最後の)質問に導かれます。 質問B): A)での私の仮定が正しい場合、read()要求を満たすために利用可能なデータがあるためブロックする必要はないのに、なぜ中断されるのですか?言い換えると、なぜread()シグナルハンドラーを実行した後に再開されず、最終的にすべての利用可能なデータ(結局利用可能だった)が返されることになりますか?

1
systemdはkill -9をどのように生き残りますか?
最近の「コンソールセッションを終了する「-9を殺す」理由」と「カーネルパニックを取得する方法」の質問の間に、サドルの下にバーがありkill -9 1、ほとんど最新のArch Linuxラップトップで試してみました。ユーザーID「root」として実行しました。 何らかのクラッシュ、パニック、またはシャットダウンを完全に予想していましたが、何も起こりませんでした。私がやったkill -9 1効果なしに、再び。 Arch Linuxマシンはsystemd最近実行されているのでsystemd、kill -9をどのように乗り切るのでしょうか?Linux 3.7カーネルには特殊なケースコードがあると思いますが、おそらく考えていない別の理由が存在する可能性があります。 PID 1で実行される他のものはどうですか?Slackwareはまだ使用しているinitと信じていますが、実稼働のSlackwareサーバーで試してみるのは怖いです。ワイヤレスルーターのDD-WRTは、ある種の/ sbin / initを実行します。

2
さまざまな信号が送信される原因は何ですか?
プロセスが受信できるすべての信号に、少し混乱することがあります。私が理解しているように、プロセスにはこれらの各シグナルにデフォルトのハンドラー(signal disposition)がありますが、を呼び出すことで独自のハンドラーを提供できますsigaction()。 だからここに私の質問があります:各信号が送信される原因は何ですか?の-sパラメータを使用してkill、実行中のプロセスに手動で信号を送信できることを理解していますが、これらの信号が送信される自然な状況は何ですか?たとえば、いつSIGINT送信されますか? また、処理できる信号に制限はありますか?SIGSEGV信号さえ処理し、制御をアプリケーションに戻すことができますか?
28 process  signals 

2
親がinitである<defunct>プロセスを強制終了するにはどうすればよいですか?
NASで送信が断続的に停止しています。SIGTERMを送信しても、プロセスリストから消えず、その&lt;defunct&gt;横にラベルが表示されます。SIGKILLを送信しても、それは消えませんinit。親はであるため、親を終了できません。プロセスを削除して送信を再開できる唯一の方法は、再起動することです。 私ができる最善のことはTransmissionを試して修正することです(そして試してみました)が、私はコンパイルの初心者であり、それをいじり始める前に私の急流が終わったことを確認したかったです。

1
フォアグラウンドジョブでのctrl cとctrl z
Ctrl+ Z一方、仕事を停止Ctrl+がC仕事を殺します。 何故ですか?他の方法はもっと意味がありませんか? z@z-lap:~$ sleep 100&amp; [1] 4458 z@z-lap:~$ sleep 200&amp; [2] 4459 z@z-lap:~$ jobs [1]- Running sleep 100 &amp; [2]+ Running sleep 200 &amp; z@z-lap:~$ fg %1 sleep 100 ^Z [1]+ Stopped sleep 100 z@z-lap:~$ jobs [1]+ Stopped sleep 100 [2]- Running sleep 200 &amp; z@z-lap:~$ fg %1 sleep …

2
永久にプロセスを終了しようとする場合、「kill」のオプションはどれを使用すべきですか?
私は人々から多くの混合メッセージを受け取っており、実際にあなたが使用するものに大きな違いはないのだろうかと思っていました。 kill 'x' killall 'x' kill -9 'x' これらは私がこれまでに使用するように言われたいくつかのオプションですが、一部の人々は、キル-9は単に過剰であり、キル自体は機能しないなどと言います。 プロセスを終了するだけの最も標準的な場合(したがって、その状態も同様)に使用すべきアドバイスはありますか? [編集]プロセスの実行を停止して、最初から新しいプロセスを実行できるようにする場合に使用するものを探しています
26 process  kill  signals 

2
SIGTERMでSIGSTOPされたプロセスを強制終了できないのはなぜですか?保留中のシグナルはどこに保存されますか?
Debian stretch(systemd)を使用しています。フォアグラウンドでrsyslogデーモンを実行して/usr/sbin/rsyslogd -n いたので、Ctrl+ Zを押し て停止しました。プロセスの状態がTl(停止、スレッド化)に変更されました。プロセスに複数のコマンドを発行しましたが、プロセスの状態は同じでした。をしたら、それは死にました。質問が3つあります。kill -15 &lt;pid&gt;Tlfg SIGSTOP-edプロセスが応答しなかったのはなぜSIGTERMですか?カーネルがカーネルを同じ状態に保つのはなぜですか? SIGCONT信号を受信した瞬間になぜ殺されたのですか? 前のSIGTERMシグナルが原因であった場合、プロセスが再開するまでどこに保存されていましたか?
24 process  kill  signals 

2
接続が閉じられたときに「tail -f」と呼ばれるリモートで終了する方法は?
を実行するとssh user@remote_host tail -f /some/file、tail -f /some/filessh接続が閉じられていてもremote_hostで実行し続けることに気付きました! したがって、いくつかの接続と切断の後、実行数がtail -f /some/file増加します。tail -fSSH接続が閉じられたときに実際に終了する方法は?

5
「xargs」が子の出口を無視し、さらに処理を続ける方法
xargs夜間に長時間仕事をすることもありますが、午前xargs中にどこかで途中で死亡したことを発見するのは本当に迷惑です。たとえば、今夜のように1つの特別なケースでセグメンテーションエラーが発生したためです。 1人のxargs子でも殺された場合、それ以上の入力は処理されません。 コンソール1: [09:35:48] % seq 40 | xargs -i --max-procs=4 bash -c 'sleep 10; date +"%H:%M:%S {}";' xargs: bash: terminated by signal 15 09:35:58 3 09:35:58 4 09:35:58 2 &lt;Exit with code 125&gt; コンソール2: [09:35:54] kill 5601 xargs子プロセスが終了すると、入力の処理を停止することをどうにかして防ぐことができますか?
24 kill  xargs  signals 



5
Ctrl + Cを押したときにシェルスクリプトでバックグラウンドプロセスが終了して終了するのをどのように待ちますか
バックグラウンドプロセスを実行するようにシェルスクリプトを設定しようとしています。シェルスクリプトを実行Ctrlcすると、子プロセスが強制終了されて終了します。 私が思いついた最高のものはこれです。またkill 0 -INT、待機が発生する前にスクリプトを強制終了するため、子が完了する前にシェルスクリプトが終了します。 このシェルスクリプトを送信後に子供が死ぬのを待つ方法についてのアイデアはありますINTか? #!/bin/bash trap 'killall' INT killall() { echo "**** Shutting down... ****" kill 0 -INT wait # Why doesn't this wait?? echo DONE } process1 &amp; process2 &amp; process3 &amp; cat # wait forever

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.