rc.local を自動実行できない

rc.local を自動実行できない

スクリプトを実行しようとしました/etc/rc.localが、どうにもうまくいきません。 を使用して手動で実行することはできますがservice rc.local start、ホーム ディレクトリのファイルに 'hi' がエコーされるだけですが、再起動すると実行されません。すべての適切な権限が設定されており、リンクは適切な rc#.d ディレクトリに存在するようです。参考までに、関連情報を以下に示します。

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local


# ls -l /etc/init.d/rc.local                                  
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local


# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local


# cat /etc/rc.local
#! /bin/bash

echo hi > ~user/test

exit 0

/etc/rc.localとの両方を削除し/etc/init.d/rc.local、 を実行しupdate-rc.d rc.local remove、それらを復元して、update-rc.d rc.local defaultsこの質問のように実行してみました。Rc.localは実行されませんそれはうまくいきませんでした。

また、再起動後や、任意の init レベルに入った後も機能しません。シェバン行が または を読み取った場合は機能しませんでした#! /bin/sh -e。ただし、手動で実行すると、と の両方のスクリプトを別のファイルにエコー#! /bin/bashできます。/etc/rc.local/etc/init.d/rc.local

そこで質問なのですが、何が間違っているのでしょうか。また、rc.local を実行するにはどうしたらよいのでしょうか。また、代替案 (upstart など) について聞くのは構いませんが、rc.local を正常に実行する方法 (そして理想的には何が間違っているのか) を示してくれる (または見つけるのに役立つ) 回答のみ受け付けます。

以下に、参考になる追加情報を示します。

# dmesg | grep "Linux version"
[    0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)


# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012

# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 14 Nadia
Release:        14
Codename:       nadia

答え1

問題は次の行にあります:

echo hi > ~user/test

~user予想どおりに拡張されていません。rc.localは実行中ですが、予期しない拡張のため、権限がない可能性のある場所に書き込もうとしています。

代わりに次のことを試してください。

echo ~user/test > /dev/shm/test

次に、 の内容を確認します。これにより、 が実行されることと、それが何に展開されるかが/dev/shm/test表示されます。rc.local~user

ただし、外部環境に頼るのではなく、明示的なパスを使用することをお勧めします。

答え2

「代替案(upstart など)について聞いても構わない」というのは、あなたがいくつかのことを理解していないことを意味します。私は mint ユーザーではありませんが、どうやらこれは upstart ベースのシステムです。Upstart は init デーモンであり、あなたのシステムには 1 つしかインストールされていません。したがって、upstart は代替案ではありません。代替案はありません。あなたのシステムはUpstartを使用しています。以上です。他には何も使用しません。ただし、upstart には sysvinit スクリプトとの下位互換性があるため、/etc/rc ディレクトリにリンクを配置してサービスを管理したり、 や などの古いコマンドを使用したりすることserviceができますupdate-rc.d

あなた自身が認めているように、sysvinit システムの動作についてあまり理解していないので、学ぶのは時間の無駄だと思います。実際の init デーモンの動作を学んだほうがよいでしょう。Upstart は非常に簡単です。Upstart に関する不満 (および fedora 派生システムの systemd に関する不満) の 95% は、sysvinit について簡単に理解しているだけで、新しいことを学ぶのに数時間を費やさなければならないかもしれないと怒っている人々によるものであることを覚えておいてください。

したがって、sysvinit スタイルのリンクについては rc ディレクトリなどをチェックすることをお勧めしますが、あなたがリンクした「Rc.local が実行されない」という質問 (その解決策が失敗したと言っている) を見ると、この時点では時間の無駄だと思います。sysvinit の互換性と /etc/rc および init.d ディレクトリは忘れてください。

Upstart は(注意: init.d ではありません).conf内のファイルを処理します/etc/init。したがって、起動時に実行したいスクリプトがある場合は、.conf ファイルを /etc/init に追加するだけです。実行可能である必要はありませんが、所有者は root である必要があります。

author "You"

start on started local-filesystems

script
    /etc/rc.local # but don't really be this lazy, see below
end script

今後の混乱や sysvinit のさらなる不正を防ぐために、/etc/rc.local スクリプトの名前を別の名前に変更するか、さらに良い方法として、スクリプト内の内容を .conf ファイルに移動することをお勧めします ( タグscriptend scriptタグの間のすべてがシェルによって処理されます)。

アップスタートの決定的な参考文献はおそらくアップスタートの料理本前述したように、これはユーザーフレンドリーな点では sysvinit から改善されていますが、残念ながら、これに関する適切な資料はオンラインではまだ不足しており、混乱した不完全なものが多くあります。ただし、起動時にスクリプトを実行するのは、今説明したように簡単です。

.confファイルの名前が「my-localboot.conf」の場合、次のようにサービスをテストできます。

initctl start my-localboot

関連情報