LoginSignup
0
0

シェルのジョブ管理、デーモン

Last updated at Posted at 2024-05-18

ジョブとは

bashのようなシェルがバックグラウンドで実行したプロセスを制御するための仕組みです。

ジョブを見る

root@*********:*************# sleep infinity &
[1] 2460
root@*********:*********# sleep infinity &
[2] 2464
root@*********:*********# jobs
[1]-  実行中               sleep infinity &
[2]+  実行中               sleep infinity &
root@*********:*********# fg 1
sleep infinity
^Z
[1]+  停止                  sleep infinity
root@*********:*********# bg 1
[1]+ sleep infinity &

気づき

PIDの横の[1]がジョブの番号
一つずつ ジョブ番号が違う。

セッションとは

ユーザがgtermのような端末エミュレータ、あるいはsshなどを通してシステムにログインしたきのログインシェルに対応するものです。全てのセッションには、セッションを制御するための端末が紐づいています。
...
セッション内プロセスを操作したいときは、端末を介してシェルを始めとしたプロセスに対して指示をし、また、それらプロセスの出力を受け取ります

出典

GNOME デスクトップにログインしてから、ログアウトするまでの間をセッションといいます。 ログインマネージャによってユーザーが認証されると、セッションマネージャが開始されます。 ユーザーは、セッションマネージャによりセッションを管理できます。 たとえば、セッションの状態を保存して、次回ログインしたときにそのセッションに戻ることができます。

出典

GNOME

今回は、デスクトップ環境「GNOME」について紹介します。
まず、デスクトップ環境とは、以前も取り上げたように、「X Window System」や「Wayland」の上で動作する、GUIによる作業環境を提供するものです。ツールバーやアイコン、ウィンドウマネージャ、ファイルマネージャなどのソフトウェアをまとめたもので、「デスクトップ作業を行うのに必要なソフトウェアのセット」と言うことができます。

GNOMEは、GNUプロジェクトの一部として開発されており、すべてをフリーソフトウェアで作るというポリシーの下で開発されています。「グノーム」と読む人が多いのですが、Gを発音せず「ノーム」と読む人もいます。1999年に開発が始まっており、比較的長い歴史を持っています。

GNOMEは、登場当初、WindowsやMac OS Xに似たインターフェイスを提供したため、Linux初心者の人気を集めました。その反面、高いカスタマイズ性を持ち、ユーザの好みの通りのデスクトップを構築できるという特徴もあり、またWaylandとの親和性も向上していることから、今なお多くの人が利用するデスクトップ環境です。

GNOMEを語る上で忘れることができないのが、ファイルマネージャ「Nautilus」です。Nautilusは、ファイルやディレクトリのブラウズだけでなく、Webサイトのブラウズも行うことができるソフトウェアで、ファイルやアプリケーション、インターネット上のリソースなどを統合し、リソースに素早くアクセスできるようになっています。

多くのディストリビューションでも採用されているため、必ず覚えておきたいデスクトップ環境です。

出典

気づき

扱う端末が違うとセッションも違ってくるのか

セッションと仮想ターミナルをみてみる

root@*********:**********# ps ajx
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       1       1       1 ?             -1 Ss       0   0:01 /sbin/init s
      0       2       0       0 ?             -1 S        0   0:00 [kthreadd]
...
   2450    2626    2626    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2628    2628    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2629    2629    2435 pts/0       2629 R+       0   0:00 ps ajx

気づき

sleep infinityとps ajxのコマンドが同じセッションID、同じTTY(仮想ターミナルになっている)
違うタブでするとどこか違うところが出てくるのか?

同じターミナルで違うタブで入力してみた

vboxuser@***********:~/study$ sleep infinity &
[1] 2704
   2450    2626    2626    2435 pts/0       2450 S        0   0:00 sleep infini
   2450    2628    2628    2435 pts/0       2450 S        0   0:00 sleep infini
      2    2632       0       0 ?             -1 I        0   0:01 [kworker/0:0
      2    2660       0       0 ?             -1 I        0   0:00 [kworker/u2:
   2424    2691    2691    2691 pts/1       2706 Ss    1000   0:00 bash
      2    2703       0       0 ?             -1 I        0   0:00 [kworker/0:2
   2691    2704    2704    2691 pts/1       2706 S     1000   0:00 sleep infini
   2691    2706    2706    2691 pts/1       2706 R+    1000   0:00 ps ajx

気づき

違うタブで入力するとセッションIDも仮想ターミナルも違うことになった。

プロセスグループ

複数のプロセスをまとめてコントロールするためのものです。セッションの中には複数のプロセスが存在します。
...
killコマンドのプロセスIDを指定する引数にマイナス値を指定すると、プロセスグループにシグナルを投げられます。
例えばPGIDが100であるプロセスグループにシグナルを投げたい時はkill -100とすれば良いです。

root@*********:**********# ps ajx
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       1       1       1 ?             -1 Ss       0   0:01 /sbin/init s
      0       2       0       0 ?             -1 S        0   0:00 [kthreadd]
...
   2450    2626    2626    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2628    2628    2435 pts/0       2629 S        0   0:00 sleep infini
   2450    2629    2629    2435 pts/0       2629 R+       0   0:00 ps ajx

同じプロセスグループを見つける

プロセスグループは単純なsleep infintyだとそれぞれのPGIDがつくが、プロセスが新たに子プロセスを作ったら同じPGIDになると思う。

#!/usr/bin/python3
import os, sys
ret = os.fork()
if ret == 0:
    print("子プロセス:pid={}, 親プロセスのpid={}, PGID={}".format(os.getpid(), os.getppid(), os.getpgid(os.getpid())))
    exit()
elif ret > 0:
    print("親プロセス:pid={}, 子プロセスのpid={},PGID={}".format(os.getpid(), ret, os.getpgid(os.getpid())))
    exit()
sys.exit(1)
root@*********:************# python3 fork.py
親プロセス:pid=86215, 子プロセスのpid=86216,PGID=86215
root@************:**********# 子プロセス:pid=86216, 親プロセスのpid=1730, PGID=86215

気づき

親プロセス、子プロセスともにPGID=86215になっている

デーモン

デーモンは常駐プロセスのことです。
...
システムの開始から終了までの存在し続けます。
...

  • 端末から入出力する必要がないので、端末が割り当てられない
  • あらゆるログインセッションが終了しても影響を受けないように、独自のセッションを持つ
  • デーモンが生成したプロセスがデーモンの終了を気にしなくていいようにinitが親になっている。

出典

感想

まだまだ初歩的な投稿は続きます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0