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は実行されません。それは無駄です。

再起動または初期化レベルを入力しても機能しません。 shebang行が#! /bin/sh -eまたは場合は機能しません#! /bin/bash。ただし、手動で実行すると、/etc/rc.localスクリプトが/etc/init.d/rc.local別のファイルにエコーされるようにすることができます。

だから私の質問は...私が何を間違っているのか、どのようにrc.localを実行させるのかということです。また、代替(例:スタートアップ)について聞くことは大丈夫ですが、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ベースのシステムのようです。 Upstartはinitデーモンで、システムには1つだけインストールされています。したがって、スタートアップ企業は代替品ではありません。システムでupstartを使用します。。期間。他は使用しません。ただし、upstartにはsysvinitスクリプトとの以前のバージョンとの互換性が含まれています。つまり、/ etc / rcディレクトリにリンクを配置してサービスを管理したり、以前のいくつかのコマンドを使用したりできserviceますupdate-rc.d

あなたが認めたところによると、sysvinitシステムがどのように機能するのかよく理解していないので、それを学ぶのは時間の無駄だと思います。実際のinitデーモンがどのように機能するかを理解することもできます。 Upstartはとても簡単です。これに関する苦情(およびFedora派生製品のsystemdに関する同様の苦情)の95%はsysvinitについて簡単に理解しており、おそらく何時間も何かを学ぶ必要があるかもしれません。新しい怒りを感じてください。

したがって、sysvinitスタイルのリンクについてrcディレクトリなどを確認したいのですが、リンクしたソリューションが失敗する「Rc.local実行できない」問題と判断すると、この時点で時間を無駄にしていると思います。 sysvinitの互換性と/etc/rcとinit.dディレクトリを忘れてください。

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

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

関連情報