【Linux】サービスの自動起動 (systemd) と定期実行 (cron) の設定方法|サービス一覧確認

【Linux】サービスの自動起動 (systemd) と定期実行 (cron) の設定方法|サービス一覧確認 Linux

 

「Linuxサーバーを立ち上げたはいいけど、毎回手動でWebサーバー(Nginxとか)を起動するのが面倒!

「毎日決まった時間に、データベースのバックアップを自動で実行させたいんだけど…?」

 

ある日突然、あなたのLinuxサーバーがそんな状態になって、スマホで慌てて「linux 自動起動」とか「linux 定期実行」なんて検索して、このページにたどり着いてくれたんじゃないでしょうか。

 

もしかして、「systemd」と「cron」っていう言葉は聞いたことあるけど、「この2つって、結局何が違うの!?」って、もう途方に暮れていたり…?

linux 起動時 コマンド実行」って、どうやるのが正解なの…?って、もうパニックになっちゃいますよね😥

 

わかります、わかります!私も全く同じ経験があります。

サーバー管理って、こういう「自動化」の設定でつまずくと、一気に全部が面倒になっちゃうんですよね。

 

でも、大丈夫です!

その焦る気持ち、よーくわかります。でも、慌てて設定ファイルを闇雲にいじるのは、絶対に待ってください!

これらの「自動起動」や「定期実行」は、2つの仕組みの役割さえ理解しちゃえば、ぜんぜん難しくないんです。ハードウェアの故障なんかとは違いますからね!😮

 

この記事は、そんな「Linux自動化の壁」にぶつかってしまったあなたを救うための、安全な対処法をステップバイステップで徹底的に解説する「完全ガイド」です🕵️‍♀️✨

 

systemd (systemctl)」を使ったOS起動時のサービス自動起動から、「cron (crond)」を使った指定時間のタスクスケジューリングまで。

この記事を読み終わる頃には、「linux サービス一覧」の確認方法、「linux ジョブ 確認」のテクニック、さらには「linux ランレベル(systemdのtarget)」や「linux reboot」「linux レスキューモード」といった関連知識まで、体系的にマスターできているはずです!

 

私と一緒に、一つずつ冷静に確認していきましょうね😍

 

 

スポンサーリンク
スポンサーリンク
目次(気になるところをクリック)
  1. systemd と cron:Linux自動実行の2大巨頭
    1. systemd (System Management Daemon) の役割
    2. cron (crond) の役割
    3. どちらを使うべきかの判断基準
  2. 【systemd編】サービスの自動起動と管理(linux サービス)
    1. サービスの自動起動を設定する (enable / disable)
    2. サービスの手動起動・停止・再起動 (start / stop / restart)
    3. サービスの現在の状態を確認する (status)
    4. 【重要】linux サービス一覧の確認方法
  3. 【systemd編】OS起動時に任意のコマンドやスクリプトを実行する(linux 起動時 コマンド実行)
    1. 伝統的な rc.local は非推奨
    2. 推奨:自作の .service ファイルを作成する
  4. 【cron編】指定日時の定期実行(linux 定期実行)
    1. crontab(クロンタブ)の基本的な書き方
    2. crontab の編集・確認・削除コマンド
    3. crontab の具体的な書き方(設定例)
    4. ユーザー cron と システム cron
    5. 【重要】cron での「linux 起動時 コマンド実行」 (@reboot)
  5. cron ジョブの管理とトラブルシューティング(linux ジョブ 確認)
    1. cron ジョブが実行されたか確認する方法
    2. cron がうまく動かない時のチェックリスト
  6. 関連知識:Linuxの起動プロセスと管理(ランレベル・reboot)
    1. systemdにおける「ターゲット (target)」とは?(旧来のランレベル)
    2. 現在のターゲット(ランレベル)の確認と変更
    3. Linux の再起動とシャットダウン(linux reboot)
    4. linux レスキューモード とは?
  7. 【実践】ユースケース別・自動実行設定の選び方
  8. 安定したサーバー運用なら高機能なVPSがおすすめ
  9. まとめ

systemd と cron:Linux自動実行の2大巨頭

 

まず最初に、多くのLinux初学者の人が混乱しがちな、「systemd」と「cron」の役割分担を、はっきりとさせておきましょう!

 

この2つは、「やりたいこと(目的)」がぜんぜん違うんです。

だから、どちらが優れているっていうお話じゃなくて、やりたいことに合わせて正しく使い分ける必要があるんですね。

 

systemd (System Management Daemon) の役割

 

systemd」は、現代のLinux(RHEL/CentOS 7以降, Debian 8以降, Ubuntu 15.04以降など)における、もう「標準」と言っていい「initシステム」です。

 

initシステムっていうのは、Linuxカーネルが起動した後に、システム全体を「使える状態」にするために、いろんなプログラム(サービス)を順番に立ち上げたり、管理したりする、すっごく基本的な(PID 1の)プロセスのことを指します。

 

systemdの主な役割は、ズバリ「サービス管理」です!

 

  • OS起動時のサービス自動起動: OSが起動するのと同時に、Webサーバー(nginx)やデータベース(MySQL)みたいな「サービス」を自動で立ち上げてくれます。
  • サービスの依存関係管理: 「ネットワークが有効になってからDBを起動して、DBが起動してからWebアプリを起動する」みたいな、複雑な起動の順番もしっかり管理してくれるんです!
  • サービスの監視と自動再起動: もしサービスが何らかの理由で異常終了しちゃっても、自動で再起動させてくれる機能(監視)も持っています。
  • システム状態の管理: OSのシャットダウンや、再起動(linux reboot)、あるいは緊急時の「linux レスキューモード」への移行なんかも、全部systemdが管理してるんですよ。

 

linux サービス」の自動起動や管理(linux 自動起動)について考えたいな…って思ったら、まず真っ先に参照すべきは、この「systemd」なんです!

 

cron (crond) の役割

 

一方、「cron」(実行デーモンは crond)は、systemdよりもずーっと古くから使われている、とってもシンプルな「タスクスケジューラ」です。

 

cronの役割は、たった一つ!

指定された”時間”に、指定された”コマンド”を実行する」こと。

 

  • 定期的なタスク実行: 「毎日深夜3時にバックアップスクリプトを実行する」とか、「5分ごとにサーバーの死活監視コマンドを実行する」みたいな用途に、もうピッタリなんです。
  • 時間ベースのトリガー: cronは、OSの起動状態とか、サービスの依存関係なんて一切気にしません!(ここがsystemdと全然違うところ!)ただひたすら「時間」をキッカケ(トリガー)にして動くんですね。

 

「決まった時間に何かを実行したい!」っていう、その「linux 定期実行」のニーズには、cronを使いましょう!

 

どちらを使うべきかの判断基準

 

もうわかりましたよね?

 

▼「OSの起動と同時に、ある”状態”を維持したい」(例:Webサーバーを常に起動させておきたい)

   → systemd を使います。

 

▼「特定の”時間”が来たら、一回だけ処理を実行したい」(例:毎晩バックアップを取りたい)

   → cron を使います。

 

この基本的な違いをしっかり理解した上で、それぞれの具体的な使い方を、さっそく見ていきましょう!

 

 

スポンサーリンク

【systemd編】サービスの自動起動と管理(linux サービス)

 

systemdを操作するためのメインのコマンドが、「systemctl」です。

これ、もう絶対仲良くなっておかないといけないコマンドですよ!

 

systemdは、「ユニット(Unit)」っていう”かたまり”で、管理する対象を扱います。

その中でも、私たちが一番よく使うのが、サービスを定義するための「サービスユニット(.service ファイル)」なんです。

 

サービスの自動起動を設定する (enable / disable)

 

サーバーを再起動(linux reboot)した後も、勝手にサービスが起動してほしい!

そう設定するためには、「enable」サブコマンドを使います。

 

▼ サービスの自動起動を有効にする

sudo systemctl enable [サービス名].service

(例:nginxの自動起動を有効にする)

sudo systemctl enable nginx

(「.service」は省略できることが多いですよ)

 

これを実行すると、systemdは「OK!次回のOS起動時から、このサービスを自動で起動するね!」って、設定をちゃんと記憶してくれます。

 

▼ サービスの自動起動を無効にする

sudo systemctl disable [サービス名]

(例:nginxの自動起動を無効にする)

sudo systemctl disable nginx

 

▼ 自動起動が設定されているか確認する

systemctl is-enabled [サービス名]

(例:nginxの状態を確認)

systemctl is-enabled nginx

 

実行結果として、「enabled(有効になってるよ!)」または「disabled(無効だよ!)」って、ちゃんと教えてくれます。

 

サービスの手動起動・停止・再起動 (start / stop / restart)

 

enable / disable は、あくまで「次回の起動時」の設定でしたよね。

でも、「今すぐ!」サービスを操作したい時だって、いっぱいあります!

 

そんな時は、「start」「stop」「restart」を使います。

 

▼ サービスを今すぐ起動する

sudo systemctl start [サービス名]

▼ サービスを今すぐ停止する

sudo systemctl stop [サービス名]

▼ サービスを今すぐ再起動する

sudo systemctl restart [サービス名]

 

この「restart」は、nginxとかの設定ファイル(nginx.confとか)を変更した後に、設定を反映させるために実行する、っていうケースで本当によく使いますよ!

 

サービスの現在の状態を確認する (status)

 

サービスが今、ちゃんと正しく動いているのか?

最後にいつ起動したのか?

もしかして、エラーとか発生してない…?

 

そんな時に不可欠なのが、この「status」サブコマンドです!

 

systemctl status [サービス名]

(例:nginxの状態を確認)

systemctl status nginx

 

このコマンドは、もうビックリするくらい、たくさんの情報を私たちに教えてくれます。

 

  • Loaded: サービス定義ファイル(.service ファイル)が、ちゃんと読み込まれているか。
  • Active: サービスが現在、動作中かどうか。(これが一番大事!)
    • active (running): 正常に動作中です!やったね!
    • inactive (dead): 停止しています。
    • active (exited): 処理(一回きりの処理)を実行して、正常に終了しました。
    • failed: (ヤバい!)起動に失敗したか、異常終了しました。
  • Enabled / Disabled: 自動起動が設定されているか。
  • ログ: 直近のログ(エラーメッセージとか)もここに表示されます。

 

サーバーで何かトラブルがあった時、まず最初にやるべきことは、関連するサービスの systemctl status を確認すること!

これ、もうサーバー管理者の鉄則ですよ!

 

【重要】linux サービス一覧の確認方法

 

「で、そもそも、このLinuxシステム上でどんなサービスが動いてるの?」

「どのサービスが自動起動する設定になっちゃってるの?」

 

これを知ることは、管理の基本中の基本ですよね。

 

▼ 現在メモリ上でアクティブな(起動中の)全ユニット一覧

systemctl list-units

 

でも、これだとサービス以外のものもいっぱい表示されて、ちょっと見づらいかも…。

そんな時は、サービス(.service)だけに絞り込むことができます。

 

systemctl list-units --type=service

 

▼ システムにインストールされている全サービスの「自動起動設定」一覧

 

こっちの方が、「linux サービス一覧」の確認としては、もっと実用的かもしれません!

 

systemctl list-unit-files --type=service

 

このコマンドは、インストールされてる全てのサービスが、今「自動起動が有効(enabled)」なのか「無効(disabled)」なのか、それとも「設定不可(static)」なのかを、ぜーんぶ一覧表示してくれます!

 

STATE 説明
enabled 自動起動が有効になっています。OS起動時に自動で起動します。
disabled 自動起動が無効になっています。手動で start するか、他のサービスから要求されない限り起動しません。
static 自動起動の有効/無効を設定できません。通常、他のサービスから依存関係として呼び出される(WantedBy= がない)サービスです。
masked サービスが「マスク」されています。enablestart もできない、最も強い無効化状態です。誤って起動するのを防ぎたい場合に使います。

 

systemctl list-unit-files –type=service | grep enabled みたいに grep と組み合わせれば、自動起動が有効なサービスだけを抜き出して見ることもできちゃいますよ。

 

 

スポンサーリンク

【systemd編】OS起動時に任意のコマンドやスクリプトを実行する(linux 起動時 コマンド実行)

 

多くの人が「linux 起動時 コマンド実行」って検索する時、nginx みたいな既存のサービスのことじゃなくて、「自分で作ったシェルスクリプト」をOS起動時に実行したい!って考えているケースが、すっごく多いんですよね。

 

伝統的な rc.local は非推奨

 

昔のLinux(SysVinitっていう古い仕組み)では、/etc/rc.localっていうファイルに、実行したいコマンドをただ書いておくだけで、起動時の最後に自動で実行してくれたんです。

すっごくお手軽でしたよね。

 

でも…、systemdが主流になった現代では、この方法はもう非推奨なんです😥

なんでかって言うと、systemdはサービスの起動を並列でいっぱい実行して、OSの起動を速くしよう!って頑張ってるのに、rc.local に重たーい処理が書いてあると、その処理が終わるまで、システム全体の起動が待たされちゃう(ブロックされちゃう)可能性があるからなんです。

 

推奨:自作の .service ファイルを作成する

 

じゃあどうすればいいの!?っていうと、答えは「systemdの流儀に従う」ことです。

たとえ自分で作ったスクリプトであっても、それを実行するための「.service」ファイル(ユニットファイル)を、ちゃんと自分で作ってあげる。

これが、一番クリーンで、今風の、推奨される方法なんです!

 

これ、ちょっと面倒に聞こえるかもしれませんが、すっごいメリットがあるんですよ!

自作のスクリプトを、nginxとかと同じ、ちゃんとした「サービス」として扱えるようになるので、起動の順番(依存関係)を制御したり異常終了したら自動で再起動させたり…っていう、systemdの強力な機能の恩恵をぜんぶ受けられるようになるんですから!

 

ステップ1:実行するシェルスクリプトの作成

 

まずは、起動時に実行させたいスクリプトを、いつも通り作ります。

 

(例:/usr/local/bin/my_startup_script.sh)

#!/bin/bash 起動時に実行したいスクリプト

 

作成したら、絶対に忘れちゃいけないのが「実行権限」の付与です!

これ、本当によく忘れるんですよね…(私もやりました😅)

 

sudo chmod +x /usr/local/bin/my_startup_script.sh

 

ステップ2: .service ファイルの作成

 

次に、このスクリプトを呼び出すための「お作法」である、.service ファイルを作ります。

作成する場所は、/etc/systemd/system/ の中が一般的です。

 

(例:/etc/systemd/system/my-startup.service)

[Unit] Description=My Startup Script Service このサービスが起動するタイミングを定義 (例:ネットワークが有効になった後に起動) After=network.target [Service] Type=simple: メインプロセスが起動したら「起動完了」とみなす Type=oneshot: 一回きりの処理(スクリプト実行など)に使う Type=oneshot RemainAfterExit=yes 実行するスクリプトのフルパス ExecStart=/usr/local/bin/my_startup_script.sh 実行するユーザーやグループ(任意) User=myuser Group=mygroup

 

ちょっと難しそうに見えますが、大丈夫!

[Unit] セクション: サービスの説明(Description)や、起動の順番(After:〜の後に起動してね)を定義します。

[Service] セクション: サービスの振る舞い(Type=oneshot:一回実行したら終わるタイプだよ)や、実行するコマンド(ExecStart)を定義します。

[Install] セクション: systemctl enable した時に、どの起動モード(WantedBy:CUIの標準モード)に関連付けるかを定義します。

 

ステップ3: systemd に認識させ、有効化する

 

新しい .service ファイルを作ったり、変更したりしたら、systemdに「ねえねえ、ファイル変えたから、読み込み直して!」って教えてあげる必要があります。

 

sudo systemctl daemon-reload

 

そしたら、いよいよ私たちが作った新しいサービスを、自動起動(enable)しちゃいましょう!

 

sudo systemctl enable my-startup.service

 

たったこれだけです!

これで、次回のOS起動時から、自動で /usr/local/bin/my_startup_script.sh が実行されるようになりました!🎉✨

 

「今すぐ」実行を試してみたい場合は、start コマンドを使えばOKです。

 

sudo systemctl start my-startup.service

 

実行した後、ちゃんと動いたかどうか、status や、さっきスクリプトに仕込んだログファイル(/var/log/my_startup.log)を確認してみましょうね!

 

systemctl status my-startup.service

 

 

スポンサーリンク

【cron編】指定日時の定期実行(linux 定期実行)

 

systemdが「状態の維持」を得意とするチャンピオンだったのに対して、「cron」は「時間ベースの実行」を得意とする、もう一人のチャンピオンです。

 

cronの設定は、「crontab(クロンタブ)」っていう、専用の設定ファイルに書き込んでいきます。

 

crontab(クロンタブ)の基本的な書き方

 

crontabは、6つの「魔法のフィールド」で構成されています。

呪文みたいですけど、すっごくカンタンですよ!

 

分 時 日 月 曜日 コマンド

 

  • 分 (minute): 0〜59
  • 時 (hour): 0〜23
  • 日 (day of month): 1〜31
  • 月 (month): 1〜12 (または jan, feb みたいな省略形もOK)
  • 曜日 (day of week): 0〜7 (0と7はどっちも日曜日です。または sun, mon もOK)
  • コマンド: 実行したいコマンド(絶対パスで書くのが超重要!)

 

アスタリスク(*)は、「ぜんぶ!(毎分、毎時)」っていう意味のワイルドカードです。

 

crontab の編集・確認・削除コマンド

 

cronの設定は、ぜんぶ「crontab」コマンドを使って行います。

(設定ファイルを直接編集するんじゃないんですね!)

 

▼ cron設定を編集する(最重要)

crontab -e

 

このコマンドを実行すると、デフォルトのエディタ(vi とか nano とか)が起動して、設定ファイルを編集できる状態になります。

 

▼ 現在の cron設定一覧を表示する

crontab -l

 

▼ 現在の cron設定をすべて削除する(注意!)

crontab -r

 

この -r は本当に気をつけてください! なんの確認もなく、一瞬で全部消えちゃいますからね!😭

基本的には、「-e」で編集して、「-l」で確認する、この2つをメインで使います。

 

crontab の具体的な書き方(設定例)

 

crontab -e で開いたファイルに、こんなふうに呪文を書いていきます。

 

(例1)毎日深夜 2時0分にバックアップスクリプトを実行

0 2 * * * /usr/local/bin/backup.sh

(例2)毎週日曜日 の AM 4時30分にシステム再起動

30 4 * * 0 /sbin/reboot

(0 または 7 または sun が日曜日です)

(例3)毎時 0分(1時0分, 2時0分, ...)にコマンド実行

0 * * * * /path/to/command

(例4)5分ごとにスクリプトを実行

*/5 * * * * /path/to/script.sh

(*/n は「nごと」っていう意味です。便利!)

(例5)平日の 9時~18時の間、30分ごと(毎時0分と30分)に実行

0,30 9-18 * * 1-5 /path/to/command

(-(ハイフン)は範囲、,(カンマ)は複数指定、1-5 は月〜金です)

 

書式 意味
すべて(毎分、毎時など) * * * * (毎分)
n 指定した数値 10 * * * * (毎時10分)
n,m n と m 0,30 * * * (毎時0分と30分)
n-m n から m まで 0 9-17 * * (9時~17時の毎時0分)
/n n ごと /10 * * * * (10分ごと)

 

ユーザー cron と システム cron

 

crontab -e で設定したのは、そのコマンドを実行した「ユーザー」個人のcron設定(/var/spool/cron/ に保存されます)で、そのユーザーの権限で実行されます。

 

これとは別に、「システム全体」で管理されるcron設定もあるんです。

 

  • システムcron ( /etc/crontab ): システム全体の設定ファイルです。これ、ユーザーcronと書式がちょっとだけ違って、「実行ユーザー」を指定するフィールドが間に追加されるんです!
    • (例:0 2 * * * <b>root</b> /usr/local/bin/system_backup.sh)
  • cron.d ( /etc/cron.d/ ): アプリケーションが独自にcron設定を追加したい時に使うディレクトリです。ここに置かれたファイルは /etc/crontab と同じように扱われます。
  • anacron ( /etc/cron.hourly|daily|weekly|monthly ): もっとお手軽な方法もあります!これらのディレクトリに実行権限を付けたスクリプトを「置くだけ」で、それぞれ「毎時」「毎日」「毎週」「毎月」実行してくれます。
    • しかもこれ、anacronっていう賢い仕組みで管理されることが多くて、もし指定時間にPCの電源がオフになってても、次回起動した時に「あ、実行し忘れてた!」って気づいて実行してくれるんですよ!すごくないですか?

 

【重要】cron での「linux 起動時 コマンド実行」 (@reboot)

 

cronには、あの「分・時・日・月・曜日」っていう時間指定の代わりに使える、すっごく便利な「特殊な文字列」が用意されています。

 

その中で、私たちが「linux 起動時 コマンド実行」したい時に、もう最高に便利なのが「@reboot」です!

 

@reboot /path/to/your/script.sh

 

crontab -e で、たったこれだけを書いておくだけで、OSが起動したタイミング(正確には crond デーモンが起動したタイミング)で、指定したコマンドを一回だけ実行してくれるんです!

 

さっきのsystemdみたいに、わざわざ .service ファイルを作成するほどでもない、本当に簡単な起動時実行であれば、この <b>@reboot</b> を使うのが、もう圧倒的に手軽な方法です!

 

ただし!

systemdみたいに「ネットワークが有効になってから実行してね!」みたいな、複雑な依存関係の管理はぜんぜんできません。

なので、実行するタイミングがシビアな処理には、やっぱり向いてないんですね。

 

 

スポンサーリンク

cron ジョブの管理とトラブルシューティング(linux ジョブ 確認)

 

cron を設定したのはいいんだけど、「あれ…?なぜか動かない!」「実行されたのかどうかも、わかんない!

これ、cron運用あるあるの、最たるものですよね…😥

 

linux ジョブ 確認」は、cronを使いこなすための、もう一つの肝(キモ)なんです!

 

cron ジョブが実行されたか確認する方法

 

cronがジョブを実行すると、通常はシステムの「ログ」に、ちゃんとその足跡(記録)が残されます。

 

▼ CentOS / RHEL 系のログ確認

sudo journalctl -u crond.service

または

sudo grep CRON /var/log/cron

 

▼ Debian / Ubuntu 系のログ確認

sudo journalctl -u cron.service

または

sudo grep CRON /var/log/syslog

 

journalctl を使う場合は、-f オプションでログをリアルタイムに監視したり、-S "10 minutes ago" で「直近10分間」のログだけを表示することもできて、すっごく便利ですよ!

 

ログには、いつ、どのユーザーが、どのコマンド(CMD)を実行しようとしたかが、ちゃーんと記録されています。

 

cron がうまく動かない時のチェックリスト

 

「手動でコマンドを打つと成功するのに、cronで実行すると、なぜか失敗する…」

 

もしそんな状態なら、犯人は「実行環境の違い」です、間違いありません!

私たちがターミナルで実行する時と、cronが実行する時とでは、世界(環境変数とか)がぜんぜん違うんです…。

 

⚠️cron トラブルシューティングの「4箇条」⚠️

  1. コマンドやスクリプトは「絶対パス」で指定しているか? cron実行時は PATH 環境変数が最小限しか設定されてません! (NG例)* * * * * my_script.sh (OK例)* * * * * /home/user/my_script.sh backup みたいなコマンドでも、which backup でフルパス(例:/usr/bin/backup)を調べて、絶対パスで指定するのが鉄則です!
  2. スクリプトに実行権限(+x)は付与されているか? chmod +x /path/to/script.sh を忘れちゃってて、動かないケース、すっごく多いです(私です)。
  3. スクリプト内の「環境変数」は解決できているか? スクリプトが内部で ~/.bashrc とかで設定した環境変数(JAVA_HOME とか)に依存してると、cronからは実行できません。 スクリプトの冒頭で source /home/user/.bashrc するか、必要な変数をスクリプト内で直接定義してくださいね。
  4. crond デーモンは起動しているか? めったにないですけど、念のため…。systemctl status crond (または cron) で状態を確認してみましょう。

 

5. 標準出力・標準エラー出力をログにリダイレクトする(超重要)

 

cronは、実行結果(エラーとか)を「メール」でユーザーに送信しようとします。

でも、メールサーバーなんて設定してないよ!っていう場合、エラーが出ても、それに気づくことすらできないんです…。

 

だから、トラブルシューティング中は、以下のように設定して、標準出力(1)と標準エラー出力(2)を、ぜんぶログファイルに書き出す(&gt;&gt;)ようにしちゃいましょう!

 

*/5 * * * * /path/to/script.sh >> /var/log/my_cron.log 2>&1

 

「2&gt;&amp;1」っていうのは、「標準エラー出力(2番)も、標準出力(1番)と同じ場所(=この場合はログファイル)に送ってね!」っていう、魔法のおまじないです。

 

このログファイル(/var/log/my_cron.log)の中身を見れば、あなたのスクリプトがどんなエラーを吐いて止まっちゃってるのか、一目瞭然になりますよ!💪✨

 

 

スポンサーリンク

関連知識:Linuxの起動プロセスと管理(ランレベル・reboot)

 

systemdは、サービスの自動起動だけじゃなくて、OSの起動プロセス「ぜんぶ」を管理してるんだよ、ってお話しましたよね。

 

この章では、戦略的意図として求められた「ランレベル」「reboot」「レスキューモード」について、systemdの観点から、しっかり解説しちゃいますね!

 

systemdにおける「ターゲット (target)」とは?(旧来のランレベル)

 

systemdが普及する前の古いLinux(SysVinit)では、「linux ランレベル」っていう概念で、システムの動作モードを 0〜6 の数字で定義していました。

 

  • ランレベル0: シャットダウン
  • ランレベル1: シングルユーザーモード(メンテナンス用)
  • ランレベル3: CUI(マルチユーザー、ネットワークあり)
  • ランレベル5: GUI(マルチユーザー、ネットワークあり、グラフィカル)
  • ランレベル6: 再起動

 

でも、systemdでは、この「ランレベル」の代わりに「ターゲット(.target ユニット)」っていう、もっとカッコイイ概念が使われるようになったんです。

 

ターゲットっていうのは、特定の状態(例えば「GUIが使える状態」)にするために必要な、複数のサービスユニットをひとまとめにグループ化したもの、ってイメージです。

 

ちゃんと、昔のランレベルと対応するターゲットが用意されていますよ。

 

旧ランレベル systemd ターゲット 説明
0 poweroff.target システムのシャットダウン
1 rescue.target linux レスキューモード(最小限のサービス)
2, 3, 4 multi-user.target CUIでのマルチユーザーモード(サーバーの標準)
5 graphical.target GUIでのマルチユーザーモード(デスクトップの標準)
6 reboot.target システムの再起動(linux reboot

 

現在のターゲット(ランレベル)の確認と変更

 

▼ デフォルトの起動ターゲット(OS起動時に到達するターゲット)を確認

systemctl get-default

(実行結果例:graphical.target)

 

▼ デフォルトの起動ターゲットを変更

(例:GUI起動(デスクトップ)をCUI起動(サーバー)に変更する)

sudo systemctl set-default multi-user.target

 

▼ 現在のターゲット(ランレベル)を一時的に変更

isolate」コマンドを使うと、OSを再起動しなくても、現在のターゲットを切り替えることができます。

 

(例:GUIモードからCUIモードに(一時的に)切り替える)

sudo systemctl isolate multi-user.target

 

Linux の再起動とシャットダウン(linux reboot)

 

システムの再起動やシャットダウンも、もちろん systemd(systemctl)が管理しています。

 

reboot」や「poweroff」みたいな、昔ながらの伝統的なコマンドも使えますけど、実は、最近のシステムだと、それらのコマンドは内部的に systemctl の別名(エイリアス)になってることが多いんですよ。

 

▼ 再起動

sudo systemctl reboot

または

sudo reboot

 

▼ シャットダウン(電源OFF)

sudo systemctl poweroff

または

sudo poweroff

 

shutdown」コマンドも、もちろん引き続き利用可能です!

systemd環境では、shutdown コマンドも、systemdに「シャットダウンお願い!」ってリクエストを送る、賢いラッパーとして機能してくれます。

 

▼ 10分後に再起動(メッセージ付き)

sudo shutdown -r +10 "10分後にメンテナンスのため再起動します。作業を保存してください。"

▼ スケジュールされたシャットダウンをキャンセル

sudo shutdown -c

 

linux レスキューモード とは?

 

rescue.target」(旧ランレベル1)は、システムが正常に起動しなくなっちゃった時とかに使う、緊急用のメンテナンスモードです。

 

rescue.target に移行すると、ネットワークやGUIみたいな主要なサービスは一切起動しないで、本当に最小限のシステム(ルートファイルシステムをマウントした状態)だけが起動します。

 

▼ 正常起動中にレスキューモードへ移行する

sudo systemctl isolate rescue.target

 

rootのパスワードを求められた後、シングルユーザーのCUIシェルに入ることができます。

 

▼ 起動しないシステムでレスキューモードに入る

システムが multi-user.target に到達できなくて、起動に失敗しちゃう…。

そんな時は、起動時のブートローダー(GRUB)の画面で、カーネルのパラメータに「systemd.unit=rescue.target」(または、昔ながらに数字の「1」だけでもOK)って追記して起動することで、強制的にレスキューモードに入ることができます。

 

このモードで、設定ファイルを修正したり、ファイルシステムをチェック(fsck)したり、systemdの .service ファイルのミスを直したり…っていう、システムの復旧作業を行うんですね。

 

 

スポンサーリンク

【実践】ユースケース別・自動実行設定の選び方

 

ここまでの知識をぜーんぶ使って、よくあるシナリオで、あなたが「systemd」と「cron」のどっちを使うべきか、具体的に判断してみましょう!

もうカンタンですよね?

 

ケース1:Webサーバー (Nginx) をOSと同時に起動し、常時稼働させたい

  • 答え: systemd
  • 理由: これは「状態の維持(常時稼働)」が目的の、典型的な「linux サービス」だからです!
  • コマンド: sudo systemctl enable nginx

 

ケース2:自作の常駐監視スクリプト(Python等)をOS起動時に実行したい

  • 答え: systemd (推奨)
  • 理由: 常駐プロセス(デーモン)として動かしたいなら、systemdで .service ファイルを作るのが最適解!異常終了時の自動再起動(Restart=on-failure)とかも設定できますしね!
  • コマンド: 自作の .service ファイルを作成して、sudo systemctl enable my-app.service

 

ケース3:毎日深夜3時にデータベースのバックアップスクリプトを実行したい

  • 答え: cron
  • 理由: 「毎日深夜3時」っていう、「時間ベース」の実行が目的だからです!
  • コマンド: crontab -e0 3 * * * /path/to/backup.sh を追記

 

ケース4:1時間ごとにサーバーのディスク使用量をログファイルに記録したい

  • 答え: cron
  • 理由: 「1時間ごと」っていう、これも「時間ベース」の定期実行だからです。
  • コマンド: crontab -e0 * * * * df -h >> /var/log/disk_usage.log を追記 (または、お手軽に /etc/cron.hourly/ にスクリプトを置く)

 

ケース5:OS起動時に、/tmp ディレクトリ配下の一時ファイルを掃除したい

  • 答え: systemd または cron (@reboot)
  • 理由: OS起動時に「一回だけ実行」する処理ですよね。
  • 推奨: 実は、systemdには systemd-tmpfilesっていう一時ファイル管理専用の、もっと賢い仕組みがすでにあって、そっちが自動でやってくれることが多いです。
  • 代替: もし独自のルールで掃除したいなら、簡単なスクリプトを crontab -e@reboot /path/to/cleanup.sh って書くのが、一番手軽ですね!

 

 

スポンサーリンク

安定したサーバー運用なら高機能なVPSがおすすめ

 

ここまで、systemd や cron を使ったLinuxサーバーの管理方法について、詳しく解説してきました!

これらの設定を安定して動かし続けるには、当然ですけど、信頼性の高いサーバー環境が、絶対に必要不可T欠ですよね。

 

自宅のPCや、古いマシンをサーバー代わりにして学習するのも、もちろんすっごく良いことです!

でも、実際にWebサービスやボットを「24時間365日」動かし続けたい!って思うなら、やっぱり専門のサーバーをレンタルするのが、一番現実的なんです。

 

特に、systemd によるサービス管理や、cron による定期実行を、本気で学んで、実践する場として、「VPS(仮想専用サーバー)」は、もう最適の環境です!

 

VPSなら、月額たったの数百円~数千円程度で、あなた専用の「root権限付きLinuxサーバー環境」を、まるごと手に入れることができちゃいます。

 

  • 24時間安定稼働: 自宅のPCみたいに、電源を気にする必要がありません!
  • 固定グローバルIP: 外部から安定してアクセスできる、自分だけの住所が手に入ります。
  • クリーンな環境: いつでもOSを再インストールできるので、systemd や cron の設定を、何度失敗しても大丈夫! ゼロから何回でも試すことができます。

 

nginx の自動起動設定(systemctl enable nginx)を試したり、cron でバックアップジョブを(@reboot も含めて)組んでみたり…。

そういう「実践の場」として、VPSはあなたにとって最高の学習環境になってくれるはずですよ!

 

 

スポンサーリンク

まとめ

 

今回は、Linuxサーバー管理の「要(かなめ)」である、「自動起動(systemd)」と「定期実行(cron)」について、その違いから具体的な設定方法、関連知識までを、網羅的に解説してきました!

 

この記事で解説した対処法を、もう一度おさらいしますね。

 

OS起動時のサービス管理 (linux 自動起動):

  • systemd を使います!
  • サービスの有効化/無効化: sudo systemctl enable/disable [サービス名]
  • サービスの起動/停止/状態確認: sudo systemctl start/stop/status [サービス名]

 

指定日時のタスク実行 (linux 定期実行):

  • cron を使います!
  • 設定の編集: crontab -e
  • 書式: 分 時 日 月 曜日 コマンド

 

自作スクリプトの起動時実行 (linux 起動時 コマンド実行):

  • 推奨: systemdで自作の .service ファイルを作成する(依存関係や再起動を管理できるから)
  • 簡易: cron の @reboot を使う(手軽だけど、実行タイミングは制御しにくい)

 

サービス一覧の確認 (linux サービス一覧):

  • systemctl list-unit-files --type=service で、自動起動設定の一覧がぜんぶ見られます!

 

ジョブの確認 (linux ジョブ 確認):

  • cronの実行ログ(/var/log/cronjournalctl -u cron)を、まず確認!
  • cronが動かない時は、「絶対パス指定」「環境変数」「実行権限」を、もう一度よーく疑ってみてください!

 

関連知識:

  • 旧来の「linux ランレベル」は、systemdの「ターゲット(multi-user.target など)」に置き換わりました。
  • linux reboot(再起動)」や「linux レスキューモード(rescue.target)」も、systemctl コマンドでスマートに管理されます。

 

systemd と cron は、どちらもLinuxサーバーを「自動化」して、私たち管理者の手間を、もう劇的に減らしてくれる、すっごく強力なツールです。

 

それぞれの役割と得意分野を正しく理解して、適切に使い分けることこそが、安定したサーバー運用の、最高の一歩になりますからね!💪✨

コメント