1. 概要
このチュートリアルでは、Linuxシステムの起動時にコマンドまたはスクリプトを実行する方法を説明します。 rc.local ファイル、cronジョブ、およびsystemdサービスを使用したさまざまな方法について説明します。
2. 従来のアプローチ:rc.localファイル
Linuxを実行しているマシンを起動すると、最初に実行されるプロセスはinitプロセスです。 init プロセスは、マシンの現在の状態に基づいて特定のスクリプトを実行します。 これらの状態はランレベルと呼ばれます。 各実行レベルで、一連の rcスクリプトが実行され、システムを使用またはシャットダウンできるようになります。
rc.local スクリプトファイルは、ほとんどのUNIXオペレーティングシステムで使用できるはずです。 ただし、最新のLinuxディストリビューションでは、デフォルトでは使用できない可能性があることを知っておく必要があります。したがって、手動で構成する必要があります。 rc.localスクリプトは、システム管理者権限で実行されます。したがって、rootとしてスクリプトまたはコマンドを実行する方が簡単です。
2.1. 使用法
システムの起動後に実行するスクリプトに簡単なコマンドを追加しましょう。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Ensure that the script will "exit 0" on success or any other
# value on error.
#
# To enable or disable this script, just change the execution
# bits.
#
# By default, this script does nothing.
pgrep -x $(teamviewerd) || teamviewerd
exit 0
スクリプトでは、システムの起動後にteamviewerdデーモンを実行する行を追加しました。 終了0以降のコマンドは実行されないことに注意してください。スクリプト内のコマンドは、正しくても実行されない場合があります。 その場合、ファイルの実行権限を確認し、それに応じて変更する必要があります。
2.2. 最新のLinuxディストリビューションでrc-localサービスを有効にする
ほとんどの主流のLinuxディストリビューションは、initおよびサービスマネージャーとしてsystemdを使用します。 systemdには、起動時にカスタムスクリプトを実行する独自の方法があります。 それでも、起動時にrc.localスクリプトを実行できるようにする単純な「rc-local」systemdプロセスを作成できます。
/etc/systemd/system/rc-local.service に新しいファイルを作成し、次の内容をファイルに入れます。
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
ファイルを保存したら、systemctlを使用してこのサービスを有効にする必要があります。
$ systemctl enable rc.local
サービスを有効にした後、 rc.local ファイルを作成し、適切な権限を付与する必要があります。
3. 代替:Cron Job
crontab は、定期的に実行するようにスケジュールできるコマンドのリストを含むファイルです。 このファイルで指定するタスクはcronジョブです。 通常、これらはcronデーモンによって実行されます。デーモンはほとんどのディストリビューションにインストールされています。
さまざまなcronプログラムがあり、それらはすべて同じように機能し、同様のcrontab形式を使用します。 いずれかを選択して構成するのは私たちの責任です。
3.1. インストール
Gentooのようなディストリビューションを実行している場合、サーバーにcronプログラムがインストールされていない場合があります。 したがって、手動でインストールして構成する必要があります。 cronieと呼ばれる軽量のcronユーティリティをインストールします。 ほとんどのリポジトリでcronieという名前で利用でき、パッケージマネージャーを使用してインストールできます。
UbuntuとDebianでは、aptを使用できます。
# apt install cronie
FedoraとRHELの場合、yumを使用できます。
# yum install cronie
インストールが完了したら、先に進んで確認します。
$ crond -V
cronie 1.5.7
次に、 crond サービスを有効にする必要があります。これは基本的に、システムの起動時に実行されるデーモンです。
# systemctl enable crond
これで、crontabでcronジョブをスケジュールする準備が整いました。
3.2. 使用法
単純なcrontabは、1つ以上の行で構成できます。 各行は、定期的に実行されるタスクに対応しています。 を作成しましょう crontab とともに crontab 指図:
$ crontab -e
最初は、空のファイルである必要があります。 システムが起動するたびに実行されるいくつかのタスクを追加しましょう。
@reboot pulseaudio -k && pulseaudio
@reboot redshift -c ~/.config/redshift/config.conf
crontabエントリは、時間フィールドとコマンドフィールドの2つのフィールドで構成されています。時間フィールドは、対応するコマンドをいつ実行するかを指定します。 このcrontabに、 @reboot を追加しました。これは、システムの起動後にコマンドを実行することを意味します。
上記のコマンドは通常のユーザーとして実行されることを知っておく必要があります。 -eオプションは、現在のユーザーのcrontabを編集するようにcrontabに指示します。コマンドを root として実行する場合は、crontabコマンドをとして実行する必要があります。 root 。これにより、rootユーザー用に別のcrontabファイルが作成されます。
起動時にrootとしてシェルスクリプトを実行するタスクを作成しましょう。
$ sudo crontab -e
@reboot . /root/upgrade-system.sh
4. 代替: systemd
systemd は、単なるサービスマネージャーおよび init システムではなく、Linuxディストリビューションでほとんどのタスクを実行するユーティリティの完全なコレクションです。
systemd の前は、さまざまな目的でさまざまなツールを使用する必要がありましたが、systemdほど効果的ではなかった場合がありました。 最近、 systemd は、Fedora、Ubuntu、Mint、Debianなどの人気のあるすべてのLinuxディストリビューションの一部です。 したがって、外部ツールに依存するのではなく、それを使用する必要があります。
4.1. スタートアップスクリプトの作成
まず、起動時に実行するコマンドを含むスクリプトファイルが必要です。 後で、このファイルをカスタムsystemdサービスで実行するように指定します。 それでは、基本的に通知デーモンを起動するスクリプトファイルを作成しましょう。
pgrep dunst || setsid -f dunst
このスクリプトは必ず実行可能にしてください。
4.2. systemdサービスの作成
スクリプトの準備ができたので、スクリプトファイルをソースするsystemdサービスを作成する必要があります。 それでは、先に進んで、 / lib / systemd /system内にstartup.serviceファイルを作成しましょう。
$ touch /lib/systemd/system/startup.service
それでは、このファイルでサービスを定義しましょう。
[Unit]
Description=Startup Script
[Service]
ExecStart=/root/.local/bin/startup.sh
[Install]
WantedBy=multi-user.target
ExecStartフィールドを変更して、起動スクリプトへのパスを指定できます。完了したら、ファイルを保存してこのサービスを有効にし、マシンが起動するたびに実行されるようにします。
# systemctl enable startup.service --now
systemd は、 –now オプションを追加したため、このサービスを有効にしてすぐに実行します。
同様に、さまざまな目的で起動時に実行する複数のサービスを作成できます。
5. 結論
このチュートリアルでは、起動時にLinuxコマンドとスクリプトを実行する方法を説明しました。 さまざまな環境で使用できる3つの異なる方法について説明しました。