|
昨日のカウンタ: 今日のカウンタ: |
(原因が違ったところにあったようなので3/6の日記で訂正します。間違った情報を流してしまって申し訳ありませんでした。m(_ _)m)
ユーザ「zaurus」の権限で動かすとターミナルからの起動でもホーム画面からの起動でも動きます。但し、このスクリプトから cron_inet.rb を root 権限で起動したり kill でシグナルを送ったりしたいのでユーザ「root」の権限で動かしたいところです。sudo で逃げるのは安易な気がしまして
ユーザ「root」の権限でターミナルの起動でも問題なく動作しますし、上記の cron_inet.rb の起動や kill などの想定している機能全て動作します。
ところがホーム画面からルート権限で動かそうとした時に問題が発生しています。画面は表示されますし、top や ps を見ると確かに root で動作しているようです。何が動かないかと言えば、`ps` 等が空文字列しか返さず、また、`ls /proc/ `などするとそれが動作しているスレッドが停止(それがメインスレッドであればスクリプトも一緒に)します。ps はフルパスで書いても同様でした。
これら(`ps` とか `ls /proc/`)は a = QPEApplication.new([$0] + ARGV); ce = ConfigEditor.new; a.showMainWidget(ce) *1 の多分、ConfigEditor.new で呼び出されたとあるwidget(class CronInetHandler < HBox という感じで)のコンストラクターやらメソッドから呼び出されているのですが、それがひょっとしたら問題かも知れません。a = QPEApplication... の前に ls /proc/#{pid}/status とかするのは問題ありませんので。
そんな訳でそのクラスの外側で pid を参照するためのサブルーチン(という呼び方でいいんでしたっけ)を用意しておいて、それを CronInetHandler から呼び出す形にしたのですが、状況は同様です。
と、ここまでが昨日やってた事です。
あんまりやりたくなかったのですが、スクリプト起動直後(CronInetHandler 等を定義する前)に別スレッドを走らせて、そこで定期的(例えば一秒間隔)にグローバル変数に $cron_inet_pid = false or (Integer)pid という感じで渡しておこうかと考えているところです。で、CronInetHandler からは $cron_inet_pid を参照すれば何とか動くかなと。グローバル変数を参照する分には文句はないのではないかと。
なにが起きているのか、原因は何なのかわかっていませんが、取り敢えず解決はできるんでないかなと思っているところです。
*1 この辺り q2chercdit から拝借しています
● が、今日は飲んでしまった事もありますし、ちょっと時間がないので上記の書き換え実験は明日に持ち越しします。