第3部 管理と自動化
第7章 プロセスとサービス管理 — ps・systemd・cron
サーバーの上では、いつも何十ものプログラムが同時に動いています。それらを「見る」「止める」「常駐させる」「定期的に走らせる」——サーバー運用の日常業務そのものを、この章で身につけます。
🎯 この章で学ぶこと
- プロセスとは何か、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 1 を systemd が務めることが多く、あらゆるサービスの起点になっています(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 がその瞬間のスナップショットなのに対し、top は1秒ごとに更新される「動く一覧」です。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
-9 は KILL シグナルで、プロセスに有無を言わさず即座に止めます。確実な反面、後片付けをさせないため、書きかけのデータが壊れるなどの副作用があり得ます。だから最初から -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 で裏に送って作業を続ける——という具合です。
& で裏に回しただけの処理は、ターミナルを閉じる(ログアウトする)と一緒に止まってしまうことがあります。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 サービス名 | 自動起動を無効にする |
特に重要なのが enable と start の違いです。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.log | nginxへのアクセス記録 |
/var/log/nginx/error.log | nginxのエラー記録 |
テキストのログを「今まさに書き込まれる様子」をリアルタイムで眺めるには、第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つの数字の意味が要です。
| 位置 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 意味 | 分 | 時 | 日 | 月 | 曜日 |
| 範囲 | 0-59 | 0-23 | 1-31 | 1-12 | 0-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 で確認できます。
近年は cron の代わりに、systemd の機能である systemd timer で定期実行を組むことも増えています。ログが journalctl で一元的に見られる、依存関係を細かく指定できる、といった利点があります。ただし記述はやや複雑です。まずは分かりやすい cron を押さえ、「同じことをsystemdでもできる」と知っておけば十分です。
セキュリティの世界には「攻撃対象領域(アタックサーフェス)を減らす」という基本原則があります。攻撃されうる入口が少ないほど、守るべき対象も減り、安全になるという考え方です。プロセスとサービスの管理は、まさにこの原則を実践する場です。
具体的には、使っていないサービスは止め、自動起動も無効にする(sudo systemctl disable --now サービス名)。動いているサービスは、それ自体が外部からの侵入口になり得ます。「昔テストで入れたきり、誰も使っていないサーバーソフトが動きっぱなし」という状態は、気づかれない穴になりがちです。ps aux や systemctl list-units --type=service で「今このマシンで何が動いているか」を定期的に棚卸しする習慣が、防御の基本になります。
逆に、身に覚えのないプロセスや見慣れないcronは、侵入・マルウェアの兆候であることがあります。攻撃者は、乗っ取ったマシンに「裏で動き続ける自分のプログラム」を仕込み、cron で「再起動されても自動で復活する」ように仕掛けるのが常套手段です。top で見慣れないプロセスが常にCPUを食っていないか、crontab -l や /etc/cron.* に覚えのない登録がないか——こうした点検は、侵害の早期発見に直結します。「動いているものを正確に把握している」こと自体が、立派なセキュリティ対策なのです(セキュリティ中級・上級コースの検知の話題にもつながります)。
まとめ
- プロセスは実行中のプログラムで、一意の番号PIDで識別される
ps auxで一覧、top/htopでリアルタイム監視、killで停止(効かなければ最終手段のkill -9)- 末尾の
&でバックグラウンド実行、jobs/fg/bg/Ctrl+Zで行き来、ログアウト後も動かすならnohup - 常駐サービス(デーモン)は
systemctlで管理。start(今起動)とenable(自動起動)は別物 - トラブル時はまずログ。
journalctl -u サービス名や/var/log、tail -fで確認 - 定期実行は
cron。crontabは「分 時 日 月 曜日 コマンド」の順。不要なサービス・不審なcronの点検はセキュリティの基本
練習問題
あるサーバーのcrontabに、次の行が書かれていました。この設定は「いつ」「何を」実行しますか。30 2 * * 0 /opt/scripts/db_backup.sh
解答を見る
crontabは左から「分 時 日 月 曜日」の順です。30 2 * * 0 は、分=30、時=2、日=毎日、月=毎月、曜日=0(日曜)を意味します。したがって「毎週日曜日の午前2時30分に、/opt/scripts/db_backup.sh(データベースのバックアップスクリプト)を実行する」という設定です。アクセスの少ない深夜・週末にバックアップを回す、典型的な運用例です。
Webサーバー nginx の設定ファイルを書き換えました。(1)変更を反映するために実行するコマンドは何ですか。(2)さらに「サーバーを再起動しても nginx が自動で立ち上がる」ようにしたい場合、どのコマンドを使いますか。(3)start と enable の違いを一言で説明してください。
解答を見る
(1)sudo systemctl restart nginx で再起動し、設定を反映します(止めたくない場合は sudo systemctl reload nginx でも可)。(2)sudo systemctl enable nginx でOS起動時の自動起動を有効にします。(3)start は「今この場で起動する」だけでOSを再起動すると止まってしまうのに対し、enable は「今後OSが起動するたびに自動で立ち上げる」設定です。本番サービスは両方を設定します。
サーバーの動作が急に重くなりました。(1)原因のプロセスを特定するには、まずどのコマンドを使いますか。(2)CPUを食い続けている暴走プロセス(PID 4521)が見つかりました。まずどのコマンドで止めるべきで、それでも止まらないときの最終手段は何ですか。
解答を見る
(1)top(または htop)を使います。CPU使用率の高い順にプロセスが並ぶので、犯人とそのPIDをすぐ特定できます。ps aux で一覧して確認してもかまいません。(2)まずは丁寧に終了を促す通常の kill 4521 を試します。プロセスは後片付けをしてから終了します。それでも応答しない場合の最終手段が、強制終了の kill -9 4521 です。-9 は後片付けをさせず即座に止めるため確実ですが、データが壊れる恐れがあるので、いきなり使わず通常の kill のあとに使います。