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

Linuxでシェルスクリプトファイルをバックグラウンドジョブで実行するとtrapが機能しない話

www.itmedia.co.jp

 「AIには少なくとも職員と同等のレベルを求め、それに達しない限り対市民向けとしては導入できないと考えた。また、AIがどのように回答したかを結局のところ職員が確認する作業が伴い、正答率が低ければそれだけ確認する頻度も上げなければならない。100%は無理としても99%は譲れない条件だった」(三豊市

ChatGPTでの業務効率化を“断念”──正答率94%でも「ごみ出し案内」をAIに託せなかったワケ 三豊市と松尾研の半年間(1/2 ページ) - ITmedia NEWS

 今回の実証実験を経て、率直な感想を三豊市に聞くと「AIは万能ではないということが分かった」と語る。

ChatGPTでの業務効率化を“断念”──正答率94%でも「ごみ出し案内」をAIに託せなかったワケ 三豊市と松尾研の半年間(1/2 ページ) - ITmedia NEWS

⇧ 技術的には不可能です、な案件だと、AIの有識者であれば気付いていたと思うんだけど、実験的な取り組みだったということですかね?

「AIは万能ではない」ってことは松尾さんが度々、発信していたから、感想として「AIは万能ではないということが分かった」という発言は違うんじゃないかと思うんだけど...

「AIは万能ではない」については、発注者、受注者、双方が承知の上で取り組んでいたと思うんだけどなぁ...

導入してみた結果、導入前に比べて職員の負担が減ったかどうか統計を取って、少しでも改善されてることが分かれば、本格導入してみて運用してみれば良いとは思うんですけどね。

解決したい課題は、業務効率化のはずなのに、AIの性能だけに焦点を当て始めてるように見えて本末転倒になっている気がしますかね...

Linuxのシステム構成

ネットの情報によりますと、

docs.huihoo.com

2.1 System Overview

Figure 2.1: Decomposition of Linux System into Major Subsystems

https://docs.huihoo.com/linux/kernel/a1/index.html

The Linux operating system is composed of four major subsystems:

  1. User Applications -- the set of applications in use on a particular Linux system will be different depending on what the computer system is used for, but typical examples include a word-processing application and a web-browser.
  2. O/S Services -- these are services that are typically considered part of the operating system (a windowing system, command shell, etc.); also, the programming interface to the kernel (compiler tool and library) is included in this subsystem.
  3. Linux Kernel -- this is the main area of interest in this paper; the kernel abstracts and mediates access to the hardware resources, including the CPU.
  4. Hardware Controllers -- this subsystem is comprised of all the possible physical devices in a Linux installation; for example, the CPU, memory hardware, hard disks, and network hardware are all members of this subsystem

https://docs.huihoo.com/linux/kernel/a1/index.html

⇧ という感じになるらしい。

Linuxカーネル構成

で、Linuxカーネルはというと、

⇧ 上図のような感じになる模様。

で、上図と、用語が微妙に噛み合わないけど、数は一致しているということで、

2.3 Overview of the Kernel Structure

Figure 2.2: Kernel Subsystem Overview

https://docs.huihoo.com/linux/kernel/a1/index.html

The Linux kernel is composed of five main subsystems:

  1. The Process Scheduler (SCHED) is responsible for controlling process access to the CPU. The scheduler enforces a policy that ensures that processes will have fair access to the CPU, while ensuring that necessary hardware actions are performed by the kernel on time.
  2. The Memory Manager (MM) permits multiple process to securely share the machine's main memory system. In addition, the memory manager supports virtual memory that allows Linux to support processes that use more memory than is available in the system. Unused memory is swapped out to persistent storage using the file system then swapped back in when it is needed.
  3. The Virtual File System (VFS) abstracts the details of the variety of hardware devices by presenting a common file interface to all devices. In addition, the VFS supports several file system formats that are compatible with other operating systems.
  4. The Network Interface (NET) provides access to several networking standards and a variety of network hardware.
  5. The Inter-Process Communication (IPC) subsystem supports several mechanisms for process-to-process communication on a single Linux system.

https://docs.huihoo.com/linux/kernel/a1/index.html

⇧ 5つの主要なサブシステムで構成されているということのよう。

何故か、興味深いものではないという理由で、

『5. The Inter-Process Communication (IPC) subsystem supports several mechanisms for process-to-process communication on a single Linux system.』

についての図解は省略されてますと...

プロセスはメモリ上に展開される

Wikipediaによると、

In computing, a process is the instance of a computer program that is being executed by one or many threads. There are many different process models, some of which are light weight, but almost all processes (even entire virtual machines) are rooted in an operating system (OS) process which comprises the program code, assigned system resources, physical and logical access permissions, and data structures to initiate, control and coordinate execution activity. Depending on the OS, a process may be made up of multiple threads of execution that execute instructions concurrently.

Process (computing) - Wikipedia

While a computer program is a passive collection of instructions typically stored in a file on disk, a process is the execution of those instructions after being loaded from the disk into memory. Several processes may be associated with the same program; for example, opening up several instances of the same program often results in more than one process being executed.

Process (computing) - Wikipedia

⇧ ということらしいので、何某かのプログラミングが実行されると、プロセス(the instance of a computer program that is being executed by one or many threads.)が生成されて、メモリ上に展開されるということですかね。

PID(Process ID)は、プロセスがインスタンスということらしいので、各プロセスを一意にするための識別子と言えるということでしょうかね。

Linuxシェルスクリプトのバックグランドプロセス(バックグラウンドジョブ)とは?

で、ネットの情報によりますと、

Linuxのプロセスは、大きく分けて、

  • User space
  • Kernel space

のどちらかに属するということになる模様。

で、肝心のバックグラウンドプロセス(バックグランドジョブ)とは?

qiita.com

通常、ユーザーが起動したプロセスはシェル(この場合はコマンドラインインターフェイスを想定しています)によって起動(フォーク)されるはずなので、キーボードなどの周辺装置から端末ドライバを介する場合はCtrl + Cを入力することによってプロセスにSIGINTを通知することができます。
そしてSIGINTを通知されたプロセスは、実装次第ですが、大抵の状況で終了するでしょう。

原理原則で理解するフォアグラウンドプロセスとバックグラウンドプロセスの違い #Linux - Qiita

このように端末からの入力を受け付ける状態になっているプロセスグループのことをフォアグラウンドプロセスグループといい、そうでない他の全てのプロセスグループのことをバックグラウンドプロセスグループといいます。

原理原則で理解するフォアグラウンドプロセスとバックグラウンドプロセスの違い #Linux - Qiita

あるいは、単にフォアグラウンドプロセス、バックグラウンドプロセスと言ったりもします。

原理原則で理解するフォアグラウンドプロセスとバックグラウンドプロセスの違い #Linux - Qiita

⇧ ということらしい。

「プロセスグループ」はと言うと、

プロセスグループ (Process Group) とは、POSIX準拠のオペレーティングシステムにおいて、1個以上のプロセスの集まりを意味する。この集まりはプロセスグループリーダーとなっているプロセスのプロセスIDと同じ値をプロセスグループIDとして識別に使用する。

プロセスグループ - Wikipedia

プロセスグループはシグナルを複数のプロセスに配布するために使用される。killシステムコールはシグナルを個々のプロセスに送るだけでなく、プロセスグループに送ることもできる。プロセスグループに向けられたシグナルは、そのグループのメンバーである全プロセスに送られる。

プロセスグループ - Wikipedia

⇧ ということらしい。

プロセスは、必ず何らかのプロセスグループに属するということでしょうかね。

と言うのも、

cgroups (control groups) とは、プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。"process containers" という名称で Rohit Seth が2006年9月から開発を開始し2007年に cgroups と名称変更され、2008年1月に Linux カーネル 2.6.24 にマージされた。それ以来、多くの機能とコントローラが追加された。

cgroups - Wikipedia

利用法

cgroups とは、同じ基準で集められたプロセスの集合である。グループは階層構造を持ち、それぞれのグループは親グループの制限を引き継ぐ。カーネルは複数のコントローラ(サブシステム)に cgroup のインターフェイスを通じてアクセスできる

cgroups - Wikipedia

⇧ cgroupsの説明で、プロセスグループのリソース管理の話が出てるので。

話が脱線しましたが、バックグランドプロセス(バックグラウンドジョブ)は、端末からの入力を受け付けないプロセスということですと。

Linuxシェルスクリプトファイルをバックグラウンドジョブで実行するとtrapが機能しない話

シェルスクリプトファイルの処理が全て終了したことをtrapコマンドで捕捉するような処理で、バックグラウンドジョブで実行するとtrapで捕捉されないという...

ネットの情報によると、

stackoverflow.com

⇧ そのものズバリの話が出てましたと。

unix.stackexchange.com

⇧ という話が出ていますと。

端末を閉じたけど、バックグラウンドプロセスがシグナルを受け付けていないと。

Linuxのシグナルはと言うと、

qiita.com

1.シグナルとは

プロセスやプロセスグループへ様々なイベントを通知するためにあるカーネルの機能です (ソフトウェア割り込み)。イベントの通知は様々な場所 (自分/他プロセス、カーネル) から行うことが可能で、次のようなことができます。

Linux シグナルの基本と仕組み (カーネル v5.5 時点) #Linux - Qiita

  • ハングしたプロセスにシグナルを送信して強制終了させる
  • シグナルを送信してプロセスの処理を一時停止・再開させる
  • ハードウェア例外 (0 除算、メモリアクセス違反など) 時にシグナルを送信してプロセスを終了させる
  • シグナルを送信する特殊なキー (Ctrl + C など) を入力しプロセスを終了させる
  • シグナル受信時にユーザ定義の関数 (シグナルハンドラ) を実行させる

Linux シグナルの基本と仕組み (カーネル v5.5 時点) #Linux - Qiita

⇧ ということですと。

で、バックグラウンドプロセスについては、

通常、ユーザーが起動したプロセスはシェル(この場合はコマンドラインインターフェイスを想定しています)によって起動(フォーク)されるはずなので、キーボードなどの周辺装置から端末ドライバを介する場合はCtrl + Cを入力することによってプロセスにSIGINTを通知することができます。
そしてSIGINTを通知されたプロセスは、実装次第ですが、大抵の状況で終了するでしょう。

原理原則で理解するフォアグラウンドプロセスとバックグラウンドプロセスの違い #Linux - Qiita

このように端末からの入力を受け付ける状態になっているプロセスグループのことをフォアグラウンドプロセスグループといい、そうでない他の全てのプロセスグループのことをバックグラウンドプロセスグループといいます。

原理原則で理解するフォアグラウンドプロセスとバックグラウンドプロセスの違い #Linux - Qiita

⇧ 端末の入力を受け付ける状態、ではないものになるという話であったのだけど、シグナルを受け付けないというのが正しいのではないかと。

ちょっと、バックグラウンドプロセスの仕様について、公的な情報が見当たらないので、何とも言えんけど、実際に、シグナルを受け付けていない事象が起きてしまっているので。

ちなみに、

www.baeldung.com

⇧ プロセスの状態とシグナルの関係は上図のようになるらしいのだけど、プロセスのライフサイクルみたいな感じなんかな?

知りたいのは、シェルスクリプトの処理が完了した時のプロセスの状態と関連するシグナルなんだけどな...

フォアグラウンドとバックグラウンドで変わってくるのかとかも依然としてよくわからないですし...

何と言うか、ブラックボックスな部分が多くて辛い...

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

今回はこのへんで。