【Linux】【rc.local】Linux OS 起動時に自動的に実行する設定を入れる

/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 内のスクリプトをすべて実行し終わらないとログイン画面に行かないことが理由となります。

もし &(アンパサンド)を付けず、且つスクリプトやプログラムが途中で止まってしまった場合は、復旧できなくなるので十分な注意が必要です。

 

 

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人