/etc/rc.local にスクリプトやプログラムを記載することで、Linux OS の起動時に自動的に root 権限で実行されます。
/etc/rc.local ファイル
■環境の確認
環境はRedHat 7系です。
[ec2-user@redhat7 rc5.d]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
[ec2-user@redhat7 rc5.d]$
|
■/etc/rc.localファイル
※デフォルトでは特に設定は入っていません。
[ec2-user@redhat7 ~]$ cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
[ec2-user@redhat7 ~]$
|
ファイルの実行権限を確認する
rc.local に実行権限があることを確認します。
[ec2-user@redhat7 ~]$ ls -lh /etc/rc.local
lrwxrwxrwx. 1 root root 13 Nov 17 01:36 /etc/rc.local -> rc.d/rc.local ← 実行権限があることを確認します。
[ec2-user@redhat7 ~]$
|
RedHat、CentOS 7系より rc.local を利用しないことが推奨されている
/etc/rc.local ファイルに記述されているコメントを確認します。
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
このファイルは互換性のために追加されています
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
このファイルを使用する代わりに、起動中にスクリプトを実行するために独自のsystemdサービスまたはudevルールを作成することを強くお勧めします。
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
起動中の並列実行のため、以前のバージョンとは対照的に、このスクリプトは他のすべてのサービスの後には実行されません。
#
# Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure
# that this script will be executed during boot.
起動中にこのスクリプトが実行されるようにするには、’chmod + x /etc/rc.d/rc.local’を実行する必要があります。
touch /var/lock/subsys/local
|
rc.local ファイルに記載されているように、RedHat 7系からは /etc/rc.local ファイルは過去の OS との互換性を保つために残ったもので、systemd サービスまたは udev ルールを作成することが推奨されています。
root アカウントではなく他のアカウントで実行したい場合は要注意
/etc/rc.local ファイルにコマンドやシェルスクリプトを挿入して root アカウントで実行する分には何の問題もありませんが、他のアカウント(例:test01 アカウントなど一般アカウント)で実行する場合は、気を付けないと失敗するので十分注意が必要です。
以下のように su コマンドで他のアカウント(test01)にスイッチしてから実行する場合は、ほぼ失敗します。
[ec2-user@redhat7 ~]$ cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
su – test01;/opt/app/test.sh” & ← こんな感じで他のアカウントにスイッチしてから実行するとほぼほぼ失敗します。
[ec2-user@redhat7 ~]$
|
サンプルスクリプトで検証してみた
以下のサンプルスクリプトを作成して /etc/rc.local に入れて検証してみました。
そっけないシェルスクリプトです。
[test01@redhat7 ~]$ cat test.sh
#!/bin/sh
echo “test” >> /home/test01/test.log
date >> /home/test01/test.log
whoami >> /home/test01/test.log
pwd >> /home/test01/test.log
ls -l >> /home/test01/test.log
[test01@redhat7 ~]$
|
■実行結果
test01 アカウントでこのシェルを実行すると以下のようになります。
[test01@redhat7 ~]$ ./test.sh
[test01@redhat7 ~]$ cat test.log
test
Wed Mar 6 12:42:07 UTC 2019
test01
/home/test01
total 8
-rw-rw-r–. 1 test01 test01 2630 Mar 6 12:42 test.log
-rwxr-xr-x. 1 test01 test01 197 Mar 6 12:42 test.sh
[test01@redhat7 ~]$
|
検証 1(su コマンドで test01 にスイッチしてからスクリプト実行)
/etc/rc.local ファイルに以下のコマンドを入れます。
最初に test01 にスイッチしてからスクリプトを実行します。
[root@redhat7 ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
su – test01;/home/test01/test.sh &
[root@redhat7 ~]#
|
OS を再起動後確認します。
[test01@redhat7 ~]$ cat test.log
test
Wed Mar 6 12:48:47 UTC 2019
root ← アカウントが root になっています。
/ ← カレントディレクトリが / になっています。
total 24
lrwxrwxrwx. 1 root root 7 Mar 23 2018 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Nov 17 01:38 boot
drwxr-xr-x. 2 root root 6 Mar 23 2018 data
drwxr-xr-x. 18 root root 2740 Mar 6 12:48 dev
drwxr-xr-x. 91 root root 8192 Mar 6 12:48 etc
drwxr-xr-x. 4 root root 36 Mar 6 11:25 home
lrwxrwxrwx. 1 root root 7 Mar 23 2018 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Mar 23 2018 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Dec 14 2017 media
drwxr-xr-x. 2 root root 6 Dec 14 2017 mnt
drwxr-xr-x. 2 root root 6 Dec 14 2017 opt
dr-xr-xr-x. 114 root root 0 Mar 6 12:48 proc
dr-xr-x—. 7 root root 4096 Mar 3 12:32 root
drwxr-xr-x. 28 root root 720 Mar 6 12:48 run
lrwxrwxrwx. 1 root root 8 Mar 23 2018 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Dec 14 2017 srv
dr-xr-xr-x. 13 root root 0 Mar 6 12:48 sys
drwxrwxrwt. 11 root root 4096 Mar 6 12:48 tmp
drwxr-xr-x. 13 root root 155 Mar 23 2018 usr
drwxr-xr-x. 20 root root 280 Oct 23 12:34 var
[test01@redhat7 ~]$
|
検証 2(su コマンドで test01 アカウントとして実行するが環境は root のまま)
次に /etc/rc.local ファイルに以下のコマンドを入れます。
root アカウントが test01 でスクリプトを実行します。
[root@redhat7 ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
su -c ‘/home/test01/test.sh &’ test01
[root@redhat7 ~]#
|
OS を再起動後確認します。
[test01@redhat7 ~]$ cat test.log
test
Wed Mar 6 13:06:23 UTC 2019
test01 ← test01 アカウントです。
/ ← カレントディレクトリが / です。つまりアカウントは test01 ですが環境は root であると言えます。
total 24
lrwxrwxrwx. 1 root root 7 Mar 23 2018 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Nov 17 01:38 boot
drwxr-xr-x. 2 root root 6 Mar 23 2018 data
drwxr-xr-x. 18 root root 2740 Mar 6 13:06 dev
drwxr-xr-x. 91 root root 8192 Mar 6 13:06 etc
drwxr-xr-x. 4 root root 36 Mar 6 11:25 home
lrwxrwxrwx. 1 root root 7 Mar 23 2018 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Mar 23 2018 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Dec 14 2017 media
drwxr-xr-x. 2 root root 6 Dec 14 2017 mnt
drwxr-xr-x. 2 root root 6 Dec 14 2017 opt
dr-xr-xr-x. 119 root root 0 Mar 6 13:06 proc
dr-xr-x—. 7 root root 4096 Mar 3 12:32 root
drwxr-xr-x. 28 root root 700 Mar 6 13:06 run
lrwxrwxrwx. 1 root root 8 Mar 23 2018 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Dec 14 2017 srv
dr-xr-xr-x. 13 root root 0 Mar 6 13:06 sys
drwxrwxrwt. 11 root root 4096 Mar 6 13:06 tmp
drwxr-xr-x. 13 root root 155 Mar 23 2018 usr
drwxr-xr-x. 20 root root 280 Oct 23 12:34 var
[test01@redhat7 ~]$
|
検証 3(su コマンドで test01 にスイッチし環境も test01)
次に /etc/rc.local ファイルに以下のコマンドを入れます。
root アカウントが test01 でスクリプトを実行します。
[root@redhat7 ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
su -c ‘/home/test01/test.sh &’ – test01
[root@redhat7 ~]#
|
OS を再起動後確認します。
[test01@redhat7 ~]$ cat test.log
test
Wed Mar 6 13:20:40 UTC 2019
test01 ← test01 アカウントです。
/home/test01 ← カレントディレクトリが /home/test01 です。つまりアカウントは test01 の環境です。
total 12
-rw-rw-r–. 1 test01 test01 4937 Mar 6 13:20 test.log
-rwxr-xr-x. 1 test01 test01 197 Mar 6 12:42 test.sh
[test01@redhat7 ~]$
|
rc.local からの起動を確実に成功させるコツ
以下がお勧めです。
- RedHat(CentOS) 6系 ← init スクリプトでサービスを起動する
- RedHat(CentOS) 7系 ← Systemd でサービスを起動する
特に自動起動の失敗を避けるために、以下の点を考慮します。
- rc.local ファイル内の記述は、相対パスではなくフルパスにする
- 起動順番が重要な場合は rc.local 以外の方法を考える
- 思わぬところでアカウントの環境が変わっている可能性があるので必ず検証する(su コマンドを利用する場合は – を必ず付けて思わぬ事態を避ける)
&(アンパサンド)を付けてバックグラウンドで実行する理由
&(アンパサンド)を付けてバックグラウンドで実行する理由ですが、/etc/rc.local 内のスクリプトをすべて実行し終わらないとログイン画面に行かないことが理由となります。
もし &(アンパサンド)を付けず、且つスクリプトやプログラムが途中で止まってしまった場合は、復旧できなくなるので十分な注意が必要です。