web-dev-qa-db-ja.com

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
atomictom

問題は、次の行にあることです。

echo hi > ~user/test

~userが期待どおりに拡張されていません。 rc.localは実行中ですが、予期しない拡張のため、おそらく許可されていない場所に書き込もうとしています。

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

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

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

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

0
bahamat

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

あなたは自分の許可ではそのsysvinitシステムがどのように機能するかをよく理解していないので、学ぶのは時間の無駄だと思います。実際のinitデーモンがどのように機能するかを学ぶこともできます。立ち上げは非常に簡単です。それに関して行われているグリップの95%(およびFedora派生システムのsystemdに関する並列グリップ)は、sysvinitを単純に把握していて、何かを学ぶのに数時間を費やす必要があるかもしれないことに怒っている人々であることに注意してください新着。

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

Upstartは、.conf内の/etc/initファイルを処理します(注:init.dではありません)。したがって、起動時に実行するスクリプトがある場合は、.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タグはシェルによって処理されます)。

Upstartの最も信頼のおけるリファレンスは、おそらく pstartクックブック です。私が言ったように、それはsysvinitからの改善であり、使いやすさの点で優れていますが、残念ながら、オンラインではまだまともな資料が不足しており、混乱した不完全なものがたくさんあります。ただし、起動時にスクリプトを実行するのは、今説明したのと同じくらい簡単です。

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

initctl start my-localboot
0
goldilocks