🎯 この章で学ぶこと

  • プロセスとは何か、PIDとは何か
  • プロセスを一覧する・止める(ps / top / kill)
  • フォアグラウンドとバックグラウンド(& / jobs / nohup)
  • 常駐サービス(デーモン)を管理する systemd / systemctl
  • ログを確認する journalctl/var/log
  • 定期実行を仕込む cron の書式

7.1 プロセスとは

プロセスとは、実行中のプログラムのことです(コンピュータ大全コース第3章の復習)。ディスクに置かれたプログラム(ファイル)は、ただのデータにすぎません。それをメモリに読み込んで実際に動き出すと、1つの「プロセス」になります。料理でいえば、レシピ(プログラム)に対して、実際に鍋で調理している状態(プロセス)にあたります。

Linuxは各プロセスに、重複しない番号PID(Process ID、プロセス番号)を割り当てます。プロセスを操作するときは、この番号を手がかりにします。人間の名前(コマンド名)は同じでも、PIDは1つずつ違うので確実に指定できます。

💡 すべてのプロセスには親がいる

プロセスは別のプロセスから生み出され、親子関係を持ちます。その大元をたどると、起動時に最初に立ち上がる PID 1 のプロセスに行き着きます。現代のLinuxでは、この PID 1systemd が務めることが多く、あらゆるサービスの起点になっています(7.4で扱います)。

7.2 プロセスを見る・止める

ps — 今動いているプロセスの一覧

現在動いているプロセスを一覧するのが ps です。実務では、全ユーザーの全プロセスを詳しく表示する ps aux という組み合わせが定番です。

$ ps aux
USER   PID  %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
root     1   0.0  0.4 168100 11200 ?     Ss   09:00   0:02 /sbin/init
root   642   0.0  0.3  90112  8100 ?     Ss   09:00   0:00 /usr/sbin/sshd
yuuki 1523   0.2  1.1 720044 44300 pts/0 Sl   10:15   0:05 python3 app.py
yuuki 1600  95.3  0.5  30244  9800 pts/0 R+   10:20   1:12 ./heavy_loop.sh

列の意味を押さえておきましょう。USER は所有者、PID はプロセス番号、%CPU/%MEM はCPUとメモリの使用率、STAT は状態、COMMAND は実行中のコマンドです。上の例では、いちばん下の heavy_loop.sh がCPUを95%も使っていて、何かおかしいと目星が付きます。特定のプロセスだけ探したいときは、第4章で学んだパイプと grep を組み合わせます。

$ ps aux | grep python
yuuki 1523  0.2  1.1 720044 44300 pts/0 Sl 10:15 0:05 python3 app.py
yuuki 1699  0.0  0.0   6480  2200 pts/0 S+ 10:22 0:00 grep --color=auto python

top / htop — リアルタイムの監視

ps がその瞬間のスナップショットなのに対し、top1秒ごとに更新される「動く一覧」です。CPUやメモリを食っているプロセスがリアルタイムで上に並ぶので、「今サーバーが重いのは何のせいか」を突き止めるのに使います。終了は q キーです。

$ top
top - 10:25:03 up  1:25,  1 user,  load average: 1.10, 0.65, 0.40
Tasks: 112 total,   2 running, 110 sleeping
%Cpu(s): 96.0 us,  2.0 sy,  0.0 ni,  2.0 id ...
MiB Mem :   3928.0 total,   1820.5 free,   980.2 used ...

  PID USER   PR  NI    VIRT   RES  %CPU %MEM  TIME+   COMMAND
 1600 yuuki  20   0   30244  9800  95.3  0.5  1:40.20 heavy_loop.sh
 1523 yuuki  20   0  720044 44300  0.3   1.1  0:05.10 python3

より見やすく色付き・操作しやすい htop という改良版もあります(標準では入っていないことが多いので、第6章の要領で sudo apt install htop で導入します)。矢印キーでプロセスを選び、その場で終了させることもできます。

kill — プロセスを止める

暴走したプロセスや不要なプロセスを止めるのが kill です。名前は物騒ですが、実際には「プロセスにシグナル(合図)を送る」コマンドです。PIDを指定して使います。

$ kill 1600

これは TERM(終了してください、という丁寧なお願い)を送ります。プロセスは後片付けをしてから自分で終了します。まずはこの通常の kill を試すのが作法です。それでも応答せずフリーズしている場合の最終手段が、強制終了の kill -9 です。

$ kill -9 1600

-9KILL シグナルで、プロセスに有無を言わさず即座に止めます。確実な反面、後片付けをさせないため、書きかけのデータが壊れるなどの副作用があり得ます。だから最初から -9 を使うのではなく、通常の kill で反応がないときの切り札と考えてください。名前でまとめて止めたいときは pkill が便利です。

$ pkill heavy_loop.sh
⚠️ ゾンビと暴走プロセス

まれに STAT 列が Zゾンビプロセスを見かけます。これは「終了したのに、親プロセスがその後始末をまだ受け取っていない」抜け殻の状態で、CPUやメモリはほぼ消費しません。多くの場合、親プロセスが処理すれば自然に消えるので、ゾンビ自体を kill しようとする必要はありません(そもそも止められません)。本当に困るのは、上の例の heavy_loop.sh のようにCPUを食い続ける暴走プロセスのほうです。まず top で犯人のPIDを特定し、kill で止める——これが基本の対処です。

7.3 フォアグラウンドとバックグラウンド

普通にコマンドを打つと、それが終わるまでプロンプトが返ってきません。これをフォアグラウンド実行と呼びます。時間のかかる処理では、その間ターミナルが占領されて何もできず不便です。そこで、処理を裏で走らせながらプロンプトを取り戻すバックグラウンド実行を使います。コマンドの末尾に & を付けるだけです。

$ ./long_job.sh &
[1] 1820
$ 

[1] はジョブ番号、1820 はPIDです。すぐにプロンプト $ が返り、裏でジョブが動きながら別の作業ができます。今動いているジョブは jobs で確認できます。

$ jobs
[1]+  Running    ./long_job.sh &

フォアグラウンドとバックグラウンドは行き来できます。関連するコマンド・操作をまとめます。

操作意味
コマンド末尾に &最初からバックグラウンドで実行する
Ctrl+Z実行中のフォアグラウンド処理を一時停止する
bg一時停止した処理を、バックグラウンドで再開する
fgバックグラウンドの処理をフォアグラウンドに戻す
jobs今のシェルが持つジョブを一覧する

典型的な流れはこうです。うっかりフォアグラウンドで重い処理を始めてしまったら、Ctrl+Z で一時停止し、bg で裏に送って作業を続ける——という具合です。

✅ ログアウトしても動かし続けたいなら nohup

& で裏に回しただけの処理は、ターミナルを閉じる(ログアウトする)と一緒に止まってしまうことがあります。SSHを切っても処理を走らせ続けたいときは nohup を使います。
nohup ./long_job.sh &
これで端末との縁が切れ、ログアウト後も動き続けます。出力は自動で nohup.out というファイルに保存されます。ただし「常時動かし続けるサービス」であれば、次の systemd に任せるのが本筋です。

7.4 systemdとサービス管理

Webサーバーやデータベースのように、ずっと裏で動き続け、要求に応え続けるプログラムデーモン(daemon)、あるいはサービスと呼びます。これらを起動・停止・自動起動設定するのが、現代のLinuxの中核 systemd です。操作には systemctl コマンドを使います。

例として、第6章で入れたWebサーバー nginx を管理してみましょう。まずは状態確認です。

$ systemctl status nginx
○ nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; disabled; ...)
     Active: inactive (dead)

Active: inactive (dead) なので、まだ動いていません。起動して、もう一度状態を見てみます。

$ sudo systemctl start nginx
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; disabled; ...)
     Active: active (running) since Tue 2026-07-08 10:40:11 JST; 5s ago
   Main PID: 2015 (nginx)
      Tasks: 2 (limit: 4657)

Active: active (running) になり、サービスが立ち上がりました。systemctl の主要な操作をまとめます。

コマンド何をするか
sudo systemctl start サービス名今すぐ起動する
sudo systemctl stop サービス名停止する
sudo systemctl restart サービス名再起動する(設定変更を反映するときの定番)
sudo systemctl reload サービス名止めずに設定だけ読み直す
systemctl status サービス名状態を確認する(sudo 不要)
sudo systemctl enable サービス名OS起動時の自動起動を有効にする
sudo systemctl disable サービス名自動起動を無効にする

特に重要なのが enablestart の違いです。start は「今この場で起動する」だけで、サーバーを再起動すると止まってしまいます。enable は「次回以降、OSが立ち上がるたびに自動で起動する」設定です。本番サービスは、両方——「今すぐ起動」かつ「今後も自動起動」——を設定するのが普通です。

$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
💡 サーバー運用でいちばん使う操作

設定ファイルを書き換えたあと sudo systemctl restart サービス名 で反映する——この一連の流れは、サーバー運用でおそらく最も頻繁に行う操作です(コンピュータ大全コース第14章のサーバー運用実務ともつながります)。「設定を変えたのに反映されない」ときは、たいてい再起動(またはreload)を忘れています。まず status で今の状態を見て、必要なら restart——この癖を付けましょう。

7.5 ログを見る

サービスが「起動しない」「途中で落ちた」ときに真っ先に見るべきなのがログ(記録)です。systemd 管理下のサービスのログは、journalctl でまとめて確認できます。-u でサービスを指定すると、そのサービスの記録だけに絞れます。

$ journalctl -u nginx
Jul 08 10:40:11 web01 systemd[1]: Starting A high performance web server...
Jul 08 10:40:11 web01 systemd[1]: Started A high performance web server.
Jul 08 10:52:03 web01 nginx[2015]: 2026/07/08 10:52:03 [error] connect() failed ...

直近だけを見たいときは -n で行数を指定したり、新しいログを追いかけ続ける -f(follow)を付けたりします。journalctl -u nginx -f とすると、リアルタイムでログが流れるので、問題の再現確認に便利です。

systemdを使わない古いソフトや、アクセスログなどは、伝統的に /var/log ディレクトリ以下にテキストファイルとして置かれます(第3章のファイルシステム構造)。代表的なものを挙げます。

ファイル内容
/var/log/syslog(Debian系)システム全般のログ
/var/log/auth.logログインや sudo の認証記録
/var/log/nginx/access.lognginxへのアクセス記録
/var/log/nginx/error.lognginxのエラー記録

テキストのログを「今まさに書き込まれる様子」をリアルタイムで眺めるには、第4章で学んだ tail -f を使います。

$ sudo tail -f /var/log/nginx/access.log
192.0.2.10 - - [08/Jul/2026:10:55:01 +0900] "GET / HTTP/1.1" 200 612
192.0.2.44 - - [08/Jul/2026:10:55:03 +0900] "GET /about HTTP/1.1" 404 153

アクセスが来るたびに新しい行が下に追加されていきます。終了は Ctrl+C です。「サービスが変だ」と思ったら、まずログを見る——これがトラブル対応の第一歩です。

7.6 定期実行のcron

「毎日深夜3時にバックアップを取る」「5分ごとに監視スクリプトを走らせる」——こうした定期実行を仕込むのが cron(クーロン)です。設定は各ユーザーの crontab(クーロンタブ)という表に書きます。編集は次のコマンドで行います。

$ crontab -e

crontabの1行は、「いつ(5つの数字)」+「何を(コマンド)」という形式です。この5つの数字の意味が要です。

位置12345
意味曜日
範囲0-590-231-311-120-7(0と7は日曜)

* は「毎(すべて)」を意味します。いくつか具体例を読んでみましょう。

# 毎日 深夜3時0分に バックアップスクリプトを実行
0 3 * * * /home/yuuki/backup.sh

# 5分ごとに 監視スクリプトを実行(分の欄が */5 = 5分おき)
*/5 * * * * /home/yuuki/check.sh

# 毎週月曜の 朝9時0分に レポートを実行(曜日 1 = 月曜)
0 9 * * 1 /home/yuuki/weekly_report.sh

「分 時 日 月 曜日」の順で、左から読むのがコツです。0 3 * * * なら「分=0、時=3、日は毎日、月は毎月、曜日は毎日 → 毎日3時0分」と読み解けます。登録済みの一覧は crontab -l で確認できます。

💡 systemd timer という選択肢

近年は cron の代わりに、systemd の機能である systemd timer で定期実行を組むことも増えています。ログが journalctl で一元的に見られる、依存関係を細かく指定できる、といった利点があります。ただし記述はやや複雑です。まずは分かりやすい cron を押さえ、「同じことをsystemdでもできる」と知っておけば十分です。

🛡️ セキュリティ・運用の視点 — 動いているものを把握し、余計なものを止める

セキュリティの世界には「攻撃対象領域(アタックサーフェス)を減らす」という基本原則があります。攻撃されうる入口が少ないほど、守るべき対象も減り、安全になるという考え方です。プロセスとサービスの管理は、まさにこの原則を実践する場です。

具体的には、使っていないサービスは止め、自動起動も無効にする(sudo systemctl disable --now サービス名)。動いているサービスは、それ自体が外部からの侵入口になり得ます。「昔テストで入れたきり、誰も使っていないサーバーソフトが動きっぱなし」という状態は、気づかれない穴になりがちです。ps auxsystemctl list-units --type=service で「今このマシンで何が動いているか」を定期的に棚卸しする習慣が、防御の基本になります。

逆に、身に覚えのないプロセスや見慣れないcronは、侵入・マルウェアの兆候であることがあります。攻撃者は、乗っ取ったマシンに「裏で動き続ける自分のプログラム」を仕込み、cron で「再起動されても自動で復活する」ように仕掛けるのが常套手段です。top で見慣れないプロセスが常にCPUを食っていないか、crontab -l/etc/cron.* に覚えのない登録がないか——こうした点検は、侵害の早期発見に直結します。「動いているものを正確に把握している」こと自体が、立派なセキュリティ対策なのです(セキュリティ中級・上級コースの検知の話題にもつながります)。

まとめ

練習問題

問題 7-1

あるサーバーのcrontabに、次の行が書かれていました。この設定は「いつ」「何を」実行しますか。
30 2 * * 0 /opt/scripts/db_backup.sh

解答を見る

crontabは左から「分 時 日 月 曜日」の順です。30 2 * * 0 は、分=30、時=2、日=毎日、月=毎月、曜日=0(日曜)を意味します。したがって「毎週日曜日の午前2時30分に、/opt/scripts/db_backup.sh(データベースのバックアップスクリプト)を実行する」という設定です。アクセスの少ない深夜・週末にバックアップを回す、典型的な運用例です。

問題 7-2

Webサーバー nginx の設定ファイルを書き換えました。(1)変更を反映するために実行するコマンドは何ですか。(2)さらに「サーバーを再起動しても nginx が自動で立ち上がる」ようにしたい場合、どのコマンドを使いますか。(3)startenable の違いを一言で説明してください。

解答を見る

(1)sudo systemctl restart nginx で再起動し、設定を反映します(止めたくない場合は sudo systemctl reload nginx でも可)。(2)sudo systemctl enable nginx でOS起動時の自動起動を有効にします。(3)start は「今この場で起動する」だけでOSを再起動すると止まってしまうのに対し、enable は「今後OSが起動するたびに自動で立ち上げる」設定です。本番サービスは両方を設定します。

問題 7-3

サーバーの動作が急に重くなりました。(1)原因のプロセスを特定するには、まずどのコマンドを使いますか。(2)CPUを食い続けている暴走プロセス(PID 4521)が見つかりました。まずどのコマンドで止めるべきで、それでも止まらないときの最終手段は何ですか。

解答を見る

(1)top(または htop)を使います。CPU使用率の高い順にプロセスが並ぶので、犯人とそのPIDをすぐ特定できます。ps aux で一覧して確認してもかまいません。(2)まずは丁寧に終了を促す通常の kill 4521 を試します。プロセスは後片付けをしてから終了します。それでも応答しない場合の最終手段が、強制終了の kill -9 4521 です。-9 は後片付けをさせず即座に止めるため確実ですが、データが壊れる恐れがあるので、いきなり使わず通常の kill のあとに使います。