※当サイトの記事には、広告・プロモーションが含まれます。

Linuxのtrapで捕捉できるシグナルを整理してみる

www.itmedia.co.jp

 OpenAIの運営団体として機能する米非営利団体OpenAIの取締役会は11月17日(現地時間)、共同創業者のサム・アルトマン氏(38)がCEOを辞任し、取締役会を離れることを発表した。

OpenAIの取締役会、サム・アルトマンCEOを解任 「取締役会の責任を果たす能力に支障をきたしている」 - ITmedia NEWS

 取締役会は公式ブログで、「アルトマン氏の辞任は、取締役会による審議プロセスを経たもの」であり、同氏が「取締役会とのコミュニケーションにおいて一貫して率直でなく、取締役会の責任を果たす能力に支障をきたしているとの結論に達した。取締役会はもはや、同氏が今後もOpenAIをリードし続ける能力があるとは信じられない」としている。

OpenAIの取締役会、サム・アルトマンCEOを解任 「取締役会の責任を果たす能力に支障をきたしている」 - ITmedia NEWS

 OpenAIの共同創業者のグレッグ・ブロックマン社長は社長には留任するが、取締役会会長は辞任する。

OpenAIの取締役会、サム・アルトマンCEOを解任 「取締役会の責任を果たす能力に支障をきたしている」 - ITmedia NEWS

www.itmedia.co.jp

 それによると、アルトマン氏は16日の夜に共同創業者でチーフサイエンティストのイリヤ・サツケバー氏から17日の正午に話したいというメールを受け取り、その時刻にGoogle Meetに参加したところ、取締役会長のブロックマン氏以外の取締役全員が参加しており、サツケバー氏から解雇を言い渡されたという。

OpenAIを辞任したブロックマン社長、アルトマンCEO解任の顛末をポスト - ITmedia NEWS

 ブロックマン氏は12時23分にサツケバー氏からGoogle Meetに招待され、その場でアルトマン氏の解雇と自身の取締役解任、社長としての留任について知らされた。OpenAIはそのタイミングでアルトマン氏が辞任するという公式ブログを公開した。

OpenAIを辞任したブロックマン社長、アルトマンCEO解任の顛末をポスト - ITmedia NEWS

⇧ 経緯が分からんので何とも言えんけど、共同創業者同士であっても、ミュージシャンのような方向性の違い、みたいな感じのことが起こるんね。

まぁ、何て言うか、村八分的な感じで秘密裏に事を進めてるところと、共同創業者全員の連帯責任みたいな感じにはならないんだ、ってところがモヤモヤしますな...

LinuxシェルスクリプトでのException Handlingってどうなってる?

awkにはException Handlingのような仕組みが存在しないけど、Linuxシェルスクリプトでは、trapを利用することで、Exception Handlingに近しいことはできると、ネット上の情報では言っている。

で、

stackoverflow.com

Regardless of where the exception table resides, I'm certain that it is memory reserved by the kernel, and likewise the exception handling functions are defined in the kernel source code; e.g. traps.c and related.

https://stackoverflow.com/questions/53292553/where-does-the-actual-code-of-exception-handler-reside-in-linux

⇧ stackoverflowによると、traps.c というソースコードが、Exception Handling的な役割を担っていると。

で、GitHubで公開されているソースコードを見た感じ、

github.com

⇧ signalを確認してそうではありそうですと。

ネットの情報を漁った限りでは、

System calls. In a typical execution of an OS kernel, such as Linux, application threads run in a physical core in unprivileged mode. Applications execute in this unprivileged mode until a trap handler transfers control back to the kernel in privileged mode. Invoking system calls involves the same process. Applications use special processor instructions, e.g. int 0x80 or syscall in the x86 architecture, which transfer control to the trap handler that executes the requested system call. A simplified overview of system call invocation is depicted in Fig. 1.

https://www.sciencedirect.com/science/article/pii/S2666281722000798

⇧ 上記のtrapが、traps.c のことで良いかが分からんけども、kernel側で機能するってことですかね。

ちなみに、

www.baeldung.com

⇧ 上記サイト様によりますと、signalの種類も様々ってことっぽいですね。

■trap

■interrupt

⇧ という違いがあるっぽい。シェルスクリプトで制御できるのは、trapってことになるんかな?

Wikipediaさんの説明によると、

Signals are standardized messages sent to a running program to trigger specific behavior, such as quitting or error handling. They are a limited form of inter-process communication (IPC), typically used in UnixUnix-like, and other POSIX-compliant operating systems.

https://en.wikipedia.org/wiki/Signal_(IPC)

⇧ ということらしい。

POSIX準拠の「OS(Operation System)」で利用されてるってことらしいので、Linuxでも利用されてるかと、多分。

Linuxのtrapで捕捉できるシグナルを整理してみる

で、Linuxのシグナルについて、

www.xmisao.com

シグナルID 33から64まではリアルタイムシグナルと呼ばれている。 事前に定義された意味はなく、アプリケーションで定義した用途に使用できる。 ただし33はglibcの内部で使用されており、使えない。

Linuxのシグナルまとめ -- ぺけみさお

qiita.com

⇧ まとめておられる方がおり、

man7.org

⇧ 上記でまとめられているらしい。

リアルタイムシグナルを除くと、38個あるのだけど、シグナルIDは31まで採番されてる感じらしい。CPUのアーキテクチャによっては利用できないシグナルとかある影響で、シグナルの数とシグナルIDが一致しないみたいね...

  Standard signals Signal numbering for standard signals
No Signal Standard Action Comment x86/ARM most others Alpha/SPARC MIPS PARISC Notes
1 SIGHUP P1990 Term Hangup detected on controlling terminal or death of controlling process 1 1 1 1  
2 SIGINT P1990 Term Interrupt from keyboard 2 2 2 2  
3 SIGQUIT P1990 Core Quit from keyboard 3 3 3 3  
4 SIGILL P1990 Core Illegal Instruction 4 4 4 4  
5 SIGTRAP P2001 Core Trace/breakpoint trap 5 5 5 5  
6 SIGABRT P1990 Core Abort signal from abort(3) 6 6 6 6  
7 SIGIOT - Core IOT trap. A synonym for SIGABRT 6 6 6 6  
8 SIGBUS P2001 Core Bus error (bad memory access) 7 0 0 10  
9 SIGEMT - Term Emulator trap - 7 7 -  
10 SIGFPE P1990 Core Floating-point exception 8 8 8 8  
11 SIGKILL P1990 Term Kill signal 9 9 9 9  
12 SIGUSR1 P1990 Term User-defined signal 1 10 30 16 16  
13 SIGSEGV P1990 Core Invalid memory reference 11 11 11 11  
14 SIGUSR2 P1990 Term User-defined signal 2 12 31 17 17  
15 SIGPIPE P1990 Term Broken pipe: write to pipe with no readers; see pipe(7) 13 13 13 13  
16 SIGALRM P1990 Term Timer signal from alarm(2) 14 14 14 14  
17 SIGTERM P1990 Term Termination signal 15 15 15 15  
18 SIGSTKFLT - Term Stack fault on coprocessor (unused) 16 - - 7  
19 SIGCHLD P1990 Ign Child stopped or terminated 17 20 18 18  
20 SIGCLD - Ign A synonym for SIGCHLD - - 18 -  
21 SIGCONT P1990 Cont Continue if stopped 18 19 25 26  
22 SIGSTOP P1990 Stop Stop process 19 17 23 24  
23 SIGTSTP P1990 Stop Stop typed at terminal 20 18 24 25  
24 SIGTTIN P1990 Stop Terminal input for background process 21 21 26 27  
25 SIGTTOU P1990 Stop Terminal output for background process 22 22 27 28  
26 SIGURG P2001 Ign Urgent condition on socket (4.2BSD) 23 16 21 29  
27 SIGXCPU P2001 Core CPU time limit exceeded (4.2BSD); see setrlimit(2) 24 24 30 12  
28 SIGXFSZ P2001 Core File size limit exceeded (4.2BSD); see setrlimit(2) 25 25 31 30  
29 SIGVTALRM P2001 Term Virtual alarm clock (4.2BSD) 26 26 28 20  
30 SIGPROF P2001 Term Profiling timer expired 27 27 29 21  
31 SIGWINCH - Ign Window resize signal (4.3BSD, Sun) 28 28 20 23  
32 SIGIO - Term I/O now possible (4.2BSD) 29 23 22 22  
33 SIGPOLL P2001 Term Pollable event (Sys V); synonym for SIGIO         Same as SIGIO
34 SIGPWR - Term Power failure (System V) 30 29/- 19 19  
35 SIGINFO -   A synonym for SIGPWR - 29/- - -  
36 SIGLOST - Term File lock lost (unused) - -/29 - -  
37 SIGSYS P2001 Core Bad system call (SVr4); see also seccomp(2) 31 12 12 31  
38 SIGUNUSED - Core Synonymous with SIGSYS 31 - - 31  

で、肝心のtrapで捕捉できるシグナルはと言うと、

man7.org

DESCRIPTION 

       The condition can be EXIT, 0 (equivalent to EXIT), or a signal
       specified using a symbolic name, without the SIG prefix, as
       listed in the tables of signal names in the <signal.h> header
       defined in the Base Definitions volume of POSIX.1‐2017, Chapter
       13, Headers; for example, HUP, INT, QUIT, TERM. Implementations
       may permit names with the SIG prefix or ignore case in signal
       names as an extension. Setting a trap for SIGKILL or SIGSTOP
       produces undefined results.

https://man7.org/linux/man-pages/man1/trap.1p.html

⇧ となっていて、「signal.h」でシグナルの一覧が確認できるらしい。あと、EXIT(数値が0)もtrapで捕捉できるみたいね。

で、「signal.h」でシグナルの一覧はと言うと、

man7.org

⇧ となっている。

仮に、上記を、trapが捕捉できるシグナルの全量と仮定すると、

signal(7) — Linux manual page
Signal numbering for standard signals
signal.h(0p) — Linux manual page
The following signals shall be supported on all implementations
No x86/ARM most others SPARC Alpha/SPARC MIPS PARISC Notes Signal Default Action Description
1 1 1 1 1   SIGHUP T Hangup.
2 2 2 2 2   SIGINT T Terminal interrupt signal.
3 3 3 3 3   SIGQUIT A Terminal quit signal.
4 4 4 4 4   SIGILL A Illegal instruction.
5 5 5 5 5   SIGTRAP A Trace/breakpoint trap.
6 6 6 6 6   SIGABRT A Process abort signal.
7 6 6 6 6        
8 7 0 0 10   SIGBUS A Access to an undefined portion of a memory object.
9 - 7 7 -        
10 8 8 8 8   SIGFPE A Erroneous arithmetic operation.
11 9 9 9 9   SIGKILL T Kill (cannot be caught or ignored).
12 10 30 16 16   SIGUSR1 T User-defined signal 1.
13 11 11 11 11   SIGSEGV A Invalid memory reference.
14 12 31 17 17   SIGUSR2 T User-defined signal 2.
15 13 13 13 13   SIGPIPE T Write on a pipe with no one to read it.
16 14 14 14 14   SIGALRM T Alarm clock.
17 15 15 15 15   SIGTERM T Termination signal.
18 16 - - 7        
19 17 20 18 18   SIGCHLD I Child process terminated, stopped, or continued.
20 - - 18 -        
21 18 19 25 26   SIGCONT C Continue executing, if stopped.
22 19 17 23 24   SIGSTOP S Stop executing (cannot be caught or ignored).
23 20 18 24 25   SIGTSTP S Terminal stop signal.
24 21 21 26 27   SIGTTIN S Background process attempting read.
25 22 22 27 28   SIGTTOU S Background process attempting write.
26 23 16 21 29   SIGURG I High bandwidth data is available at a socket.
27 24 24 30 12   SIGXCPU A CPU time limit exceeded.
28 25 25 31 30   SIGXFSZ A File size limit exceeded.
29 26 26 28 20   SIGVTALRM T Virtual timer expired.
30 27 27 29 21   SIGPROF T Profiling timer expired.
31 28 28 20 23        
32 29 23 22 22        
33         Same as SIGIO SIGPOLL T Pollable event.
34 30 29/- 19 19        
35 - 29/- - -        
36 - -/29 - -        
37 31 12 12 31   SIGSYS A Bad system call.
38 31 - - 31        

という対応いなるみたい。

概ねのシグナルIDを捕捉できるっぽい、ということで良いんだろうか?

とりあえず、trapで捕捉できるものには、シグナル以外にも、「EXIT(数値で言うと0)」があるっていうのは、要チェックですかね。

基本的には、

tm.root-n.com

⇧ よく使うシグナルは、上記のようなものになってくるようです。

atmarkit.itmedia.co.jp

 シグナルは数値またはシグナル名で指定します。シグナルの指定に使用できる値は「trap -l」で確認できます。なお、シグナル名のうち冒頭の「SIG」は省略可能です。

【 trap 】コマンド――シグナルを受け取った際の動作を設定する:Linux基本コマンドTips(324) - @IT

⇧ と言うか、「SIG」は省略できるんですね。

man7.org

DESCRIPTION 

       The condition can be EXIT, 0 (equivalent to EXIT), or a signal
       specified using a symbolic name, without the SIG prefix, as
       listed in the tables of signal names in the <signal.h> header
       defined in the Base Definitions volume of POSIX.1‐2017, Chapter
       13, Headers; for example, HUP, INT, QUIT, TERM. Implementations
       may permit names with the SIG prefix or ignore case in signal
       names as an extension. Setting a trap for SIGKILL or SIGSTOP
       produces undefined results.

https://man7.org/linux/man-pages/man1/trap.1p.html

⇧ 確かにマニュアルの説明が分かり辛い...

とりあえずは、trapで捕捉するようにするのは、良く使うらしい5個のシグナルとEXITを指定しておけば無難という感じなんですかね。

#!/bin/bash

trap [シグナル、ないしは、EXITが捕捉された時に実行したい処理] EXIT HUP INT QUIT TERM

# 何かしらの処理

⇧ みたいな感じで、記述しておけば、処理中に上記のシグナルが発生したら、trapが捕捉してくれるってことかと。

シェルスクリプトの処理による、シグナルの発動の起因がいまいちよく分からんので、trapに指定するシグナルの選定のベストプラクティスが不透明なんだが...

毎度モヤモヤ感が半端ない...

今回はこのへんで。