/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ファイルに移動し、それらの間にあるすべてのエントリにタグを付けることをお勧めしますscript
。end script
処理)シェルによって)。
スタートアップ企業の権威ある参考資料は次のとおりです。ヌボリッチレシピ。私が言ったように、これはユーザーフレンドリーの面でsysvinitに比べて改善されていますが、残念ながら、オンラインにはまだそれに関する適切な資料が不足しており、混乱し、不完全な内容がたくさんあります。ただし、起動時にスクリプトを実行するのは、先ほど説明したように簡単です。
.confファイル名が「my-localboot.conf」の場合は、次のコマンドを使用してサービスをテストできます。
initctl start my-localboot