
スクリプトを実行しようとしました/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 ファイルに移動することをお勧めします ( タグscript
とend script
タグの間のすべてがシェルによって処理されます)。
アップスタートの決定的な参考文献はおそらくアップスタートの料理本前述したように、これはユーザーフレンドリーな点では sysvinit から改善されていますが、残念ながら、これに関する適切な資料はオンラインではまだ不足しており、混乱した不完全なものが多くあります。ただし、起動時にスクリプトを実行するのは、今説明したように簡単です。
.confファイルの名前が「my-localboot.conf」の場合、次のようにサービスをテストできます。
initctl start my-localboot