[ PC系セットアップ覚書 Top]

PC系セットアップ覚書

2011年まで「俺的な非 UN*X 環境をめざして」という題でしたが、 「UNIX系」と「非UNIX系」の区別がだんだん難しくなってきましたので、 あれこれ区別しないことにしました(^_^;


[前] PCの起動を早くしたい! 2008/11b

今宵は眠らせないよ‥ 2008/11a

自分の管理下にないPCを使っていると、 20〜30分くらい放置しておくとPCが勝手に休止(サスペンド?)して あわててしまう、なんてことはよくあります。でも、たとえば 「今から一時間だけは休止してほしくないなー」なんて時も あったりします。そんなときは「コントロールパネル」の 「電源オプション」の項目をいじってやるのが普通なんですが、 自分にマシンの管理権限がなかったりするとそれもできない。 ‥でも、そんなことって、ある? というと、私の場合、あります。 出先にあるPCでちょっとhttpd(Apache)[URL]を あげて‥なんてときに困るんですよね。 サーバだから、と しばらく放置しておくとサーバが勝手に休止しちゃって 「ちょー、サーバにつながらないよ」と苦情を言われて驚く、みたいな。 まあ私の場合は「管理者パスワードを教えて」とか 「ちょっとPCの設定を変えてくれ」なんてお願いをしても大丈夫な 立場にあるはずですので、そうすりゃいいじゃん、と思わないことも ないんですけど「持たなくてよい管理者権限は持たない」 「ちょっとした思い付きで共用PCの設定を変えてはいけない」主義の 私としましては、やはり、管理者権限とか設定変更なしでも それくらい何とかしたいところです。

そこで、あれこれ調べてみたところ、上にあげるページを見つけたのですが、 これによれば
  • 「スタンバイを20分後に設定」というのは、多少正確な言い方をすれば 「『System Idle カウント』が20分になったらスタンバイに移行する」
  • 「System Idle カウント」は「コンピュータの CPU およびディスク リソースの 10% 以上を使用」するプログラムがあると、 見た目がアイドル状態であっても、リセットされてしまう。
  • なので「スクリーンセーバー 動作中はシステムスタンバイに入れない」という問題が出たりする
  • 逆に、一般ユーザ権限でスタンバイモードに入りたくないときは、 「コンピュータの CPU およびディスクリソースの 10% 以上を使用」 するプログラムを一定間隔で動かせばよい
‥ということがわかります。つまり休止状態を防ぐためには、 何らかの方法で「System Idle カウント」の値が大きくなりすぎる前に クリアしてやればよく、またカウンタの値を直接クリアする方法がわからない (‥んです、今のところ私には。私の調べ方がよくないんでしょうけど‥)、 そんな場合であっても、とりあえずCPUに負荷をかけるプログラムを 定期的に実行させれば間接的にカウンタの値をクリアしてやれば 期待した結果が得られる、ということです。

そこで。とりあえず、こんな感じのバッチファイルを書いてみました:

@echo off
rem #  no-sleep.bat ---  無限ループするので C-c 等で終了してね
set BIN=\Apps\usr-local\bin
:main
%BIN%\JPERL no-sleep.prl
%BIN%\sleep 170
goto main
exit
ここで sleep というのは、 UnxUtils 等に含まれる sleep.exe です。「sleep 30」というのは 「30秒、待っとれ!」という意味ですね。%BIN% で示された場所に、 UnxUtils や JPERL などの実行ファイルをまとめて置いてあることが このバッチファイルの前提となってます。

そして次はいよいよ、 数秒程度のあいだCPUに負荷をかけるプログラムですけど、 ここでは日頃使い慣れた Perl (JPERL) を使います。 以下のような感じで書いてみました。とりあえず log 関数 を何度も何度もしつこいくらい繰り返しながら時折時刻を 参照し、スクリプトの実行開始から5秒程度経過したのを 確認したら終了、という中身になってます。

## $worksecs 秒のあいだ、とにかくシステムに負荷をかける :D
$worksecs = 5;
$limitx = time + $worksecs;
&calc_2;
exit;

sub calc_2 {
  while(true) {
    &calc_1;
    local($dnow) = time;
    if($limitx < $dnow) { last; }
  }
}

sub calc_1 {
  local($a) = 100;
  while(0 < $a) {
    local($i) = log($a + 10);
    $a--;
  }
}
上に示したバッチファイルでは、このスクリプトは約3分弱おきに一度 呼び出される感じになってましたので、その関係で、 「2分以上放置したらスタンバイ」のような、きわめて短時間での タイマーだと通用しませんが、私が手元のPC (Win2000/WinXP) で 試してみたかぎりでは、このバッチファイルを動かしている間は PCは休止・スタンバイに入ることはないようです。

JavaScript版 [URL]も作ってみました。うまく動いてくれるといいですけど‥。



[次] バッチファイルをハックせよ 2008/10e