お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2009-08-11 05:09:03

SPHERE
メンバ
登録日: 2009-08-11

起動時に特定のコマンドを自動で実行するには?

Linuxに触れてみようと思い、Thinkpad X61のWindowsXP Proに
Wubi経由でUbuntuをインストールしてみました。

最初に思っていた以上にパームレスト下の無線LANカード(4965agn)の発熱がひどく、
こりゃいかんと対処法を調べてみたのですがどうもうまくいきません。
先輩方に助けていただきたく投書します。
少々状況説明が長いですが、ご容赦ください。

どうやらそのままでは無線LANカードがかなり電気を食べており、
これを省電力モードにすることでだいぶ発熱を抑えられるとのことでした。
sudo cat /sys/bus/pci/drivers/iwlagn/*/power_level
で状態を見てみると、
SYSTEM:auto    MODE:fixed      INDEX:0
と表示され、INDEXの値が5になっていれば省電力モードになっているそうです。

INDEXを5にして省電力モードにするには、
for i in /sys/bus/pci/drivers/iwlagn/*/power_level ; do echo 5 > $i ; done
をroot権限で実行すれば良いらしいとのことでした。
実際に端末で、
sudo su
の後に上記のコマンドを実行すれば、
SYSTEM:auto    MODE:fixed      INDEX:5
となり、省電力モードに移行できたのか発熱も随分マシに思えます。

しかし、毎回パソコンを起動して端末から長々とコマンドを打つのは正直面倒です。
なので、起動時に自動で"for~"コマンドを実行できないか?と思ったのですが、
ここでつまづきました。(ここまでが長かったですが、ここからが本題です)

いくつか調べて試してみたのですが、
やり方1) /etc/profile.d内にシェルスクリプトで置いておく
 →#!/bin/sh
  for i in /sys/bus/pci/drivers/iwlagn/*/power_level ; do echo 5 > $i ; done
  と書いたshファイルを/etc/profile.d内に置いたが、再起動後もINDEXは0のまま
やり方2) /etc/rc.localにコマンドを記述する
 →viコマンドで
  for i in /sys/bus/pci/drivers/iwlagn/*/power_level ; do echo 5 > $i ; done
  を記述したが、再起動後もINDEXは0のまま
やり方3) シェルスクリプトをシステム>設定>自動起動するアプリから起動する
 →やり方1のと同じ内容のshファイルを作って自動起動するアプリに設定するも、
  再起動後もINDEXは0のまま
いずれも実行権限については、chmodコマンドを使って設定しました。

いくらやっても起動時にINDEXを変えることができません。
Linuxに関する知識もほぼ0なので、どこに間違いがあるのかも自分ではさっぱり分かりません。
かと言って無線LANを使わないとかパームレストに何か置くといった、
後ろ向きな解決で済ますのも悔しいです。

どなたか正しいやり方を教えていただけないでしょうか。
よろしくお願いします。

オフライン

 

#2 2009-08-11 10:45:08

ack
メンバ
登録日: 2007-06-01

Re: 起動時に特定のコマンドを自動で実行するには?

同様の作業が出来る無線LANデバイスを所有していないため、解決策ではなく申し訳ないのですが、
例えば

コード:

#!/bin/sh

# このスクリプトを実行した事をメモ
echo "setindex start" > /tmp/setindex.txt
date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setindex.txt
echo "script execute by $(whoami)" >> /tmp/setindex.txt

# 書き込み実行前のINDEXの値をメモ
echo "before" >> /tmp/setindex.txt
cat /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
echo "" >> /tmp/setindex.txt

# 書き込み
for i in /sys/bus/pci/drivers/iwlagn/*/power_level
do
    echo 5 > $i
    # 実行した時間をメモ
    echo "write INDEX=5" >> /tmp/setindex.txt
    date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setindex.txt
done

# 書き込み実行後のINDEXの値をメモ
echo "after" >> /tmp/setindex.txt
cat /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
echo "" >> /tmp/setindex.txt

exit 0

/tmp/setindex.txt にメモを取るようにしてみましたが、
このような形で、随所でメモを取る動作を入れたスクリプトを /etc/profile.d などに置いてみて
何がうまくいっていないのか調べてみるのはいかがでしょうか。

オフライン

 

#3 2009-08-11 17:39:19

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

ackさん:

ありがとうございます。

まず上記のコードを見て気付きましたが、知識の浅さから私のやり方1では"exit 0"の記述はしておりませんでした。
そのため、そもそもスクリプト自体が機能してなかったようです。

改めてackさんのコードをexam.shとして、/etc/profile.d内に置きました。
その後再起動してみると、以下のエラーコードが表示されログインはできませんでした。

コード:

/etc/gdm/Xsession: Beginning sessionsetup...
cat: /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level: permission denied
/etc/profile.d/exam.sh: 20: cannot create /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level: permission denied
cat: /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level: permission denied

これは/sys/bus/pci/drivers/iwlagn/*/power_levelに実行権限が与えられていないというエラーでしょうか?
よく分からなく、とりあえず一旦exam.shは削除した後、
sudo chmod +x /sys/bus/pci/drivers/iwlagn/*/power_level
として、ls -lコマンドで確認したところ
-rwx--x--x
となっておりました。
この後一度再起動して、もう一度ls -lコマンドをしたところ、
-rw-------
と、実行権限が失われていました。
何度chmodで実行権限を与えても、再起動する度に権限が失われます。

どうしたら良いのでしょう・・・

尚、

コード:

#!/bin/sh
for i in /sys/bus/pci/drivers/iwlagn/*/power_level
do
 echo 5 > $i
done

exit 0

としたスクリプトを/etc/profile.d内に置いた場合も、
上記のようなエラーが表示されログインできませんでした。

オフライン

 

#4 2009-08-12 11:25:39

ack
メンバ
登録日: 2007-06-01

Re: 起動時に特定のコマンドを自動で実行するには?

SPHERE による投稿:

まず上記のコードを見て気付きましたが、知識の浅さから私のやり方1では"exit 0"の記述はしておりませんでした。

いえ私の方こそ申し訳ございません、/etc/profile.d 内に exit を含んだものを作ってしまうと
そこで起動処理全体から抜けてしまって起動が続かないようです。

さて本題ですが、

SPHERE による投稿:

コード:

cat: /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level: permission denied
/etc/profile.d/exam.sh: 20: cannot create /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level: permission denied
cat: /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level: permission denied

これは/sys/bus/pci/drivers/iwlagn/*/power_levelに実行権限が与えられていないというエラーでしょうか?

これは exam.sh が power_level に書き込みをする権限がないという事になります。

試しに私も手元の環境で、 /etc/profile.d/test.sh を

コード:

#!/bin/sh

whoami > /tmp/testlog.txt

として作り再起動したところ /tmp/testlog.txt には普段のユーザ名が書き込まれたので、
/etc/profile.d/ に置いたものからは 管理者権限の必要なコマンドは実行できないようです。

そこで、/etc/rc.local の exit 0 の前に whoami > /tmp/testlog.txt を足したところ、
/tmp/testlog.txt には root と書き込まれましたので、今回のコマンドは /etc/rc.local など root 権限で実行される場所で行うのが良いようです。
・・・が、

SPHERE による投稿:

やり方2) /etc/rc.localにコマンドを記述する
 →viコマンドで
  for i in /sys/bus/pci/drivers/iwlagn/*/power_level ; do echo 5 > $i ; done
  を記述したが、再起動後もINDEXは0のまま

との事ですので、rc.local の段階でどんな状況かを見てみたいところです。

そこで、/etc/rc.local の、最初から記入されているコメントと exit 0 の間に

コード:

#!/bin/sh -e

~注釈文略~

# By default this script does nothing.  ←ここまで最初から書かれているもの

#### powerlevel setting test ####
echo "setindex start" > /tmp/setindex.txt
date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setindex.txt
echo "script execute by $(whoami)" >> /tmp/setindex.txt

echo "before" >> /tmp/setindex.txt
ls -l /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
cat /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
echo "" >> /tmp/setindex.txt

for i in /sys/bus/pci/drivers/iwlagn/*/power_level
do
    echo 5 > $i
    echo "write INDEX=5" >> /tmp/setindex.txt
    date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setindex.txt
done

echo "after" >> /tmp/setindex.txt
ls -l /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
cat /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
echo "" >> /tmp/setindex.txt

exit 0 ←最初から書かれている exit 0

などのように編集し、再起動後 /tmp/setindex.txt に何が書かれているか調べてみると良さそうです。

なお、

SPHERE による投稿:

何度chmodで実行権限を与えても、再起動する度に権限が失われます。

/sys ファイルシステムは、本来ファイルではないハードウェアの情報等をファイルのように見せかけたものを
毎起動時に新しく自動的に生成するものだったと記憶しています。

/sys 以下に書き込み=システムやハードウェアの設定 を行うには、該当ファイルを chmod する、のではなく
権限を持ったユーザ(root)の権限で書き込みを行うような方法を採るのが良いやり方と思います。

※一般ユーザ権限で /sys 以下を書き換えられるように自己責任でOS全体に豪快な改造を施す事も出来るでしょうが、
※もうそれは「Ubuntu」や「初心者フォーラム」というくくりの話でもないとも思いますので。

オフライン

 

#5 2009-08-12 12:11:55

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

こいつは iwlagn ドライバがロードされてから echo 5をしないといけないので、initスクリプトとして「定期的にecho 5を実行できるかチェックして、まだ実行できないようなら待機する」という動作をさせてやる必要があります。

以下にそういう動作をするスクリプトがあるので、これを使ってください。
http://www.fell.it/2009/02/18/microcode-swhw-error/

# たぶん一ヶ月ぐらい待てば、これが不要になるドライバが配信されると思います。

オフライン

 

#6 2009-08-12 12:53:33

ack
メンバ
登録日: 2007-06-01

Re: 起動時に特定のコマンドを自動で実行するには?

hito による投稿:

こいつは iwlagn ドライバがロードされてから echo 5をしないといけない

なるほどそういう事だったんですね。
SPHEREさんが最初試された rc.local への記入でうまくいっていない理由は何だろうと思っておりました。

オフライン

 

#7 2009-08-12 16:01:10

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

ackさん、hitoさん:

ありがとうございます。

まずhitoさんが紹介されたサイトを参考にして、以下のスクリプトを/etc/init.d/Wifi.shとして書きました。

コード:

#!/bin/sh

while [ 1 ]; do
    if [ `awk -F : '{print $4}' /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level` == 0 ]; then
        echo 5 > /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level
    fi
    sleep 5
done

続いてrc.localに以下の記述を加えました。

コード:

echo “Start background job to pull down the power level of wlan interface to avoid overheating…”
/etc/init.d/Wifi.sh &

これでどうなるかと再起動してみたのですが、相変わらずINDEXは5になりません。

何がどうなってるのか分からないので、一旦Wifi.shを削除し、rc.localも元に戻しました。
その後ackさんの

コード:

#### powerlevel setting test ####
echo "setindex start" > /tmp/setindex.txt
date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setindex.txt
echo "script execute by $(whoami)" >> /tmp/setindex.txt

echo "before" >> /tmp/setindex.txt
ls -l /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
cat /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
echo "" >> /tmp/setindex.txt

for i in /sys/bus/pci/drivers/iwlagn/*/power_level
do
    echo 5 > $i
    echo "write INDEX=5" >> /tmp/setindex.txt
    date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setindex.txt
done

echo "after" >> /tmp/setindex.txt
ls -l /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
cat /sys/bus/pci/drivers/iwlagn/*/power_level >> /tmp/setindex.txt
echo "" >> /tmp/setindex.txt

をrc.localに新たに書き加え、再起動してみました。

すると、/tmp/setindex.txtは生成されていませんでした。
記述をどこか間違えたのかな?と思い、
sudo /etc/rc.local
としたところ、正常にsetindex.txtが生成されていたので、どうやらrc.localが起動時に動いてないようです・・・
(一応ls-lコマンドで確認してみましたが、-rwxr-xr-xとなってました。)

rc.localはそのままでも、起動時に実行されてるものと信じ込んでいたので、頭が思考停止状態です・・・
うーん、何がどうなっているんでしょう?
Windowsしか使ったことのないド素人にはそろそろ脳みそが厳しいです・・・

オフライン

 

#8 2009-08-12 16:40:16

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

rc.localではなく、
・/etc/init.d/以下に「Wifi」という名前でスクリプトを設置
・sudo chmod +x /etc/init.d/Wifi
・sudo update-rc.d default Wifi
としてみてください。Ubuntuではrc.localは(そのファイルそのもののコメントにもある通り)デフォルトでは使われません。

オフライン

 

#9 2009-08-12 17:09:24

ack
メンバ
登録日: 2007-06-01

Re: 起動時に特定のコマンドを自動で実行するには?

すみません便乗で質問させて下さい。
私自身は rc.local が(自分で中身を間違ったなどは別として)動作しなかった経験がなく、

hito による投稿:

Ubuntuではrc.localは(そのファイルそのもののコメントにもある通り)デフォルトでは使われません。

例えばデフォルトのランレベル 2で、特に設定行為を行わなければインストール直後には
/etc/rc2.d/S99rc.local (の本体の../init.d/rc.local)があって、/etc/rc.local を実行してくれ、
また、この rc.local の登録を削除するような動きをするソフトや状況になったこともないのですが、
Japanese Remix CDなどからインストールしていって出来上がった環境などではそうならない事
(/rc2.d/S99rc.localが登録されない形でセットアップされるとか)があったりするのでしょうか。
※今、手元にAlternate CDからインストールしてある程度好き放題した環境しかなく「一般的な状況」がわかりません。

またUbuntuの今後の設計方針的に rc.local の使用はオススメできないというようなものがあったりしますでしょうか?


SPHEREさんへ:
runlevel コマンドで今のランレベルを確認し、
/etc/rc<今のランレベル>.d/S99rc.local という名前の /etc/init.d/rc.local へのシンボリックリンクが存在しているかどうか確認してみて下さい。
(特に設定しなければUbuntuはデフォルトでランレベル2なので、/etc/rc2.d/S99rc.local だと思います。)

オフライン

 

#10 2009-08-12 17:38:51

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

ごめんなさい、誤解をまねく書き方をしてしまいました。

・/etc/rc.localは過去の互換性のために残っているので、わたしは推奨しません。明示的にはどこにも記述されていないと思いますが、initスクリプトを含め、Upstartへの移行がそのうち行われるはずです。sysvrcタイプの起動制御は行わない方が良いです。
(可能なら/etc/event.d/を使い、ダメなら/etc/init.dを使い、rc.localは最後の手段。最後の手段にすべき理由は以下です)

・現在はackさんのご理解の通り、/etc/rcN.d/S99rc.localによって機能します。S99rc.localが存在すれば機能することが期待できますが、9.04以降、S99は「GDMが起動し、デスクトップが表示されるよりも後」に実行される可能性があり(環境というか、実行するマシンの性能依存)、タイミング問題を引き起こして状況を混乱させる可能性があります。
(ただし今回の場合では、うまく動かないのは何か別の理由↓だろうと思います)

・いまいち良く因果関係が分かりませんが(未知のバグ?)なぜかrc.localが動かないよ! という報告があります。
https://lists.ubuntu.com/archives/ubuntu-users/2009-July/191682.html

というわけで、/etc/init.d/ 以下に設置して試した方が良いよ、という話になります。

オフライン

 

#11 2009-08-12 17:43:11

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

抜けがありましたorz

・/etc/rc.localは、パッケージ的には管理されていません。
・「デフォルトでは機能せず」というのは(元)*BSDユーザから見た表現で、「設定しても使えない」のではなく、「なくても良い」程度の意味です。

オフライン

 

#12 2009-08-12 18:43:42

ack
メンバ
登録日: 2007-06-01

Re: 起動時に特定のコマンドを自動で実行するには?

hito さんご教示ありがとうございます、確かに /etc/init.d/ 以下などを使ったほうが良さそうです。

SPHERE さんへ:

hito による投稿:

・いまいち良く因果関係が分かりませんが(未知のバグ?)なぜかrc.localが動かないよ! という報告があります。
https://lists.ubuntu.com/archives/ubuntu-users/2009-July/191682.html

のようにもしかすると rc.local が本当に動いていないのかもしれません。
hito さんご紹介のの方法をお試し下さい。

オフライン

 

#13 2009-08-13 09:51:41

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

ackさん、hitoさん:

ありがとうございます。
色々とトラブってしまい、だいぶ間があきました。

結論から先に書きますと、依然としてうまくいっておりません。
以下にこれまでのことを書きます。

まずhitoさんが#5で紹介して下さいましたサイトを参考に(というよりほぼ丸写しで)、

コード:

#!/bin/sh
while [ 1 ]; do
    if [ `awk -F : '{print $4}' /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level` = 0 ]; then
        echo 5 > /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level
    fi
    sleep 5
done

というコードを書き、/etc/init.d/wifiとして保存しました。
これに

コード:

chmod +x /etc/init.d/wifi
update-rc.d wifi defaults

と設定しました。

その後一旦シャットダウンしようとしたのですが、
シャットダウンを選択した後のUbuntuのロゴとプログレスバーの画面(分かりますでしょうか?)が消えた後、
真っ黒な画面に左上でカーソル?アンダーバー?が点滅する画面になり、操作を受け付けなくなりました。
正確にはキーボードで打った文字は出力されるのですが、rebootだとかexitだとか打っても画面にそれが
表示されるだけで何も起きません。試しに10分ほど放って置いたのですが画面はそのままでした。
仕方がないので一旦Thinkpadの電源ボタン長押しで無理やり電源を切って、再起動を試みました。
すると、Start〜〜ほにゃらら〜〜 [OK]といった感じの文字列が並ぶ画面で固まってしまい、起動しなくなっていました。
(通常ではまずKernelを読み込んで一旦Ubuntuロゴとプログレスバーの画面の後に、一瞬映る画面だと思います。)

起動しないものを残しても仕方ないので、その後Wubi経由のインストールを3回やり直しましたが、
必ず上記の現象が再現します。
一応のテストとして、

コード:

#!/bin/sh
echo "test" > /home/hoge/test.txt

を/etc/init.d/testとして保存し、

コード:

chmod +x /etc/init.d/test
update-rc.d test defaults

を施して再起動を試みたところ、正常にシャットダウン/ブートが行われ、
ログインした後のhomeフォルダにtest.txtが生成されていました。
ですので、#5の参考サイトから引っ張ってきたコードが、少なくとも私の環境では正常に機能しない、ということです。

それから、色々とやっているうちに気付いたのですが、
一度何らかの方法でINDEXの値を5にしても、少し放っておくと0に戻っているようです。
ということで起動時に1回コマンドを実行してもほとんど意味がなく、
無線LANの省電力モードを維持するためには常にINDEXを監視し、値が0に戻る度に再び5に書き換える、
という無限ループのスクリプトをブートからシャットダウンまで回し続けないといけないのですね。
#5の参考サイトのスクリプトもそのために、無限ループ構造になってたのですね・・・うぅむ。

いつの間にかどんどん問題が大きくなっていってる気がしますが、ここで妥協するのも悔しいので
もう少しだけ奮闘してみたいですが・・・知識のないド素人にはなかなか強力な敵です。
どうしたもんでしょうか・・・

PS:
hitoさんはもしかして、ASCII.jpの「行っとけ! Ubuntu道場!」のhitoさんなんでしょうか。
昨日見つけて、全部見ました。とても面白く読ませて頂いております。

オフライン

 

#14 2009-08-13 09:58:05

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

書き忘れです。

上記の投稿で行っているchmodコマンド及びupdate-rc.dコマンドは、
あらかじめsudo suした状態で実行しております。

念のため。

オフライン

 

#15 2009-08-13 10:06:25

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

# あ、バレたorz(別に隠してないけど)

すいません、よく考えてみたら問題のスクリプトはexitしてくれないので、/etc/init.d/に置いてupdate-rc.dしてはいけないものでした。シャットダウンが走らなくなったのはこれのせいです。

0) (すでに足した環境では、一度sudo update-rc.d Wifi remove)
1) /usr/local/sbin/Wifi として件のスクリプトを設置し、sudo chmod +x /usr/local/sbin/Wifiして実行権限を付ける
2) 単体で問題のスクリプトを起動してみる(sudo /usr/local/sbin/Wifi)

これで問題なく 5 が維持されることをチェックした上で、

3) /etc/init.d/ 以下に2) 相当のスクリプトを設置する

という感じになると思います。3) のサンプルは2)までが上手くいったことを確認してから作りますので、まず 2) をお試しください。

オフライン

 

#16 2009-08-13 11:02:53

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

hitoさん:
早速の返信、ありがとうございます。
油断して甲子園を観てたので気付くのが遅れました。汗

上記の通り、/usr/local/sbin/Wifiとして例のスクリプトを置き起動してみたところ、
INDEXの値は5を維持できていました。

無限ループ構造ですので、スクリプトを実行した端末はその後コマンドを受け付けなくなりますが、
これは仕方のないことですね?

オフライン

 

#17 2009-08-13 11:17:56

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

無限ループなスクリプトを「裏に回す」には、次のような操作をしてください。

1) 無限ループスクリプトが走っているターミナルでCtrl+z を押す
2) disown を実行する

これで、ターミナルから切り離された状態で裏で動き続けてくれます。

起動スクリプトは今晩ぐらいまでお待ちください(涙

オフライン

 

#18 2009-08-13 11:34:44

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

hitoさん:
無限ループを裏側で回す方法があったのですね。勉強になります。

色々とお世話して頂いて恐縮です。
時間等について気になさることはありませんので、手が空いたときにご教示頂ければそれで結構です。
重ね重ねありがとうございます。

オフライン

 

#19 2009-08-17 19:28:44

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

盆を挟むなどでUbuntu自体から離れてたり、依然として問題を解決できません。

一度問題を整理してみます。
何らかの方策を提案できる方がおりましたら、助けていただけると幸いです。

問題:
Lenovo Thinkpad X61(型番7675-A31)に搭載された無線LANユニット(4965AGN)の電力消費が高く、発熱がひどい。

目標:
無線LANユニットの電力消費を低く抑え、発熱を低減したい。

考えられる手段:

コード:

#!/bin/sh
while [ 1 ]; do
    if [ `awk -F : '{print $4}' /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level` = 0 ]
     then
       echo 5 > /sys/bus/pci/drivers/iwlagn/0000:03:00.0/power_level
    fi
    sleep 5
done

上記のスクリプトは、無線のドライバを監視して5秒おきに動作モードをチェックし、省電力モードを失うたびに動作モードを省電力に書き戻すものです。通常起動の後、端末からroot権限で実行すれば問題なく省電力モードを維持することができております。(rootでないとドライバを書き換えられない)

目標を達するためには、このスクリプトを「起動時にroot権限で自動的に、実行すること」が必要です。
私は、この点でつまづいています。

以上が、私の環境における問題の現状です。
何かしらの対策を、Ubuntuの先輩の皆様にご教示いただければ幸いです。
よろしくお願いします。

オフライン

 

#20 2009-08-17 21:28:15

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

すいません、まだいっこうに時間が取れないのですが、「start-stop-daemon」というものを調べて頂くと、お望みのもののスケルトン(コードの材料)があるはずです。

# すいません……orz

オフライン

 

#21 2009-08-17 22:16:44

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

hitoさん:

ありがとうございます。
何だか急かすような文章になっていることに後で気づきました。
色々とお世話して頂いていたのに、申し訳ないです。

情報をありがとうございます。
"start-stop-daemon"というものについて、勉強することにします。

オフライン

 

#22 2009-08-17 23:19:07

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: 起動時に特定のコマンドを自動で実行するには?

コード:

目標を達するためには、このスクリプトを「起動時にroot権限で自動的に、実行すること」が必要です。

「起動時」でなく「gdm による毎ログイン直後」なら /etc/gdm/PostLogin/Default が使えます.
gnome をお使いならば当面の workaround としては如何がでしょう?
サンプルファイル  /etc/gdm/PostLogin/Default.sample に使用法の解説があります.
此方では同じく root 権限が必要な mtrr の調整(再ログインで一度無効になってしまう)に使用してます.

オフライン

 

#23 2009-08-18 16:37:48

ack
メンバ
登録日: 2007-06-01

Re: 起動時に特定のコマンドを自動で実行するには?

興味が出ましたので私もやってみました。

/usr/local/sbin/Wifi に実際に無限ループ作業をするスクリプトが置いてあり、単体では期待通りに実行できるとします。

起動スクリプトのスケルトンがそのものずばり
/etc/init.d/skelton
にあったので、

コード:

sudo cp /etc/init.d/skelton /etc/init.d/Wifi
sudo chmod +x /etc/init.d/Wifi

とコピーを取って実行属性を付けました。

/etc/init.d/Wifi をエディタで開き、上から見ていきました。

コード:

# Provides:          skeleton
を
# Provides:          Wifi
に

おそらく直接の動作に関係はなさそうだが一応名前ぐらいは、と変えておきました。

コード:

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=daemonexecutablename
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

を

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
DESC="Wifi PowerSaver"
NAME=Wifi
DAEMON=/usr/local/sbin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

に

PATHに/usr/local/sbinを追加、
DESCに説明を書き、
NAMEを実際のスクリプトの名前に、
DAEMONを実際のスクリプトが/usr/local/sbin/にあるので合うように書き換え、
/usr/local/sbin/Wifi は引数を使わないのでDAEMON_ARGSはクォートの中を消してしまいました。

コード:

start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
を
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
に

start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
を
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- \
に

/usr/local/sbin/Wifi は自力でバックグラウンド動作できないので  --background を追加、
同じく /usr/local/sbin/Wifi は自力でpidfileを作らないので --make-pidfile を追加してみました。

これを保存して

コード:

sudo service Wifi start
sudo service Wifi stop
sudo service Wifi restart
など

が行えました。

そして

コード:

sudo update-rc.d Wifi defaults

で /etc/rcN.d/ 以下に登録でき、再起動後自動的に /usr/local/sbin/Wifi を実行できました。

コード:

sudo update-rc.d -f Wifi remove

で /etc/rcN.d/ 以下の登録を消せました。


このような流れで起動スクリプトを作るようです。

上記はとりあえず目的を果たせる程度の編集で済ませているので、例えば start-stop-daemon --start あたりがいい加減で二重起動を防止できておらず
端末から sudo service Wifi start を連射するといっぱいWifiが起動してしまい、その上 /var/run/Wifi.pid には一番最後のプロセスID番号しか入っていないので
sudo service Wifi stop では1個しか止められない、などという事態に陥りますが、二重起動を防ぐ方法や、全体的にもっとちゃんとした書き方を識者の皆様に
今後ご教示頂ければと思います。

オフライン

 

#24 2009-08-18 17:25:10

hito
管理者
登録日: 2007-03-18

Re: 起動時に特定のコマンドを自動で実行するには?

常に一個だけ動いていればいい、というものなので、do_startの前でdo_stopしちゃえば良いかと(ひどい)。

# どうもありがとうございます。

オフライン

 

#25 2009-08-20 23:09:48

SPHERE
メンバ
登録日: 2009-08-11

Re: 起動時に特定のコマンドを自動で実行するには?

また日が空いてしまいました。

einundzwanzighundertsechsさん:
ありがとうございます。
折角情報を寄せていただいたのですが、私の所ではうまくスクリプトが回らず目標を達することができませんでした。
ですが大変有用な情報ですので、今後のLinuxの勉強で生かしていきたいと思います。
重ね重ねありがとうございます。

hitoさん、ackさん:
ありがとうございます。
"start-stop-daemon"について勉強を続けていますが、全てを理解するにはまだ遠そうです。
ですが、さしあたってackさんの投稿を丸写しで設定することで、
目標であった無線LANを省電力モードに維持することは達成することができました。
起動時から自動的に回ってくれるので、大分発熱も和らいだ気がします。

沢山の投稿を寄せていただいたことに深く感謝しています。
おかげ様で無事に問題の解決をみることができました。
皆様、本当にありがとうございました。

オフライン

 

Board footer

Powered by FluxBB