2014年10月12日

方向幕メーカーを作ってみた。

国鉄方向幕書体というフォントがあることを知ったので、昨日いろいろ作って遊んでいたら、楽しくなってしまった。
cssでサイズを調整したり位置を合わせたりするのがだんだん面倒になり、結局、方向幕っぽい画像を作成するツールを作ってみた。

方向幕メーカー - http://houkoumaku.usoinfo.info/

ノーサポートですので自己責任でどうぞ。

usost-loop-line.png
posted by usoinfo at 12:30 | Comment(3) | 開発 | このブログの読者になる | 更新情報をチェックする

2014年05月08日

GooglePlayの発禁はどういう仕組みでやっているのだろうか……

今朝、GooglePlayからメールが来たんだ。曰く、
アプリ 電源連動スクリーンロック(パッケージ ID jp.net.usost.eisl.free)が Google Play ストアから削除されましたのでお知らせいたします。

削除の理由: コンテンツ ポリシーの露骨な性表現を含むコンテンツ条項への違反
なんでじゃーい!
そのアプリは、画面表示と言えばプレファレンス画面が一つあるだけだし、広告もつけてない。露骨な性表現が出る余地がどこにもない。
修正すべき箇所がわからない(こちらは、ないと思っている)ので、不当な削除であるという申請と共に、Googleに説明を求める文言を送付した。
本アプリケーションには性表現は存在しません。画像を表示しませんし、広告もありません。画面表示はプレファレンス画面があるだけです。「削除の理由: コンテンツ ポリシーの露骨な性表現を含むコンテンツ条項への違反」とは、本アプリケーションのどの部分を指しているのか、ご説明頂きたいと考えます。

しばらくして、GooglePlayから返事が来た。
Hi,

We appreciate the opportunity to review your app's removal. Upon further
review, we've accepted your appeal and have reinstated your app.

こうなった理由の説明なしかーい!
どうなってんでしょうね、Google。
posted by usoinfo at 09:59 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2014年03月08日

HDL-GXRをSqueeze化する

Lenny化し、カーネルも2.6.28になったHDL-GXR。これでSqueezeにできる用意が調ったわけである。いざアップグレードしようとしたが、aptでアップグレードできないので、debootstrap でrootfsを作り、入れ替えることでSqueeze化することにした。

1. 用意する物
  1. カーネルを2.6.28にしたHDL-GXR
  2. Linuxが動いているPC
  3. USB-SATA接続キット


2. HDL-GXRでSqueeze用のrootfsを作成
HDDの空き容量が結構ないとダメなので、ディスク容量が足りない時は、外付けディスクなどを使用。
以下の例では、/opt/landisk 以下に作成する。/opt/landisk/debootstrapにdebootstrapを置き、rootfsは/opt/landisk/squeezeに作成。

# mkdir -p /opt/landisk/debootstrap
# cd /opt/landisk/debootstrap
# wget http://ftp.jp.debian.org/debian/pool/main/d/debootstrap/debootstrap-udeb_1.0.26+squeeze1_all.udeb
# ar -x debootstrap-udeb_1.0.26+squeeze1_all.udeb
# tar zxvfp data.tar.gz
# export DEBOOTSTRAP_DIR=`pwd`/usr/share/debootstrap
# export PATH=$PATH:`pwd`/usr/sbin
# mkdir -p /opt/landisk/squeeze
# debootstrap --arch=armel squeeze /opt/landisk/squeeze http://ftp.jp.debian.org/debian
(略)
I: Base system installed successfully.
#

結構時間が掛かるので、しばらく待つ。終わったら、
# mount -t proc proc /opt/landisk/squeeze/proc
# chroot /opt/landisk/squeeze

最低限の設定をここでする。
# dpkg-reconfigure tzdata
(タイムゾーンをAsia/Tokyoに設定)

# passwd
(rootのパスワードを設定)

# vi /etc/apt/sources.list
(Squeezeのsources.listを設定)
--
deb http://ftp.jp.debian.org/debian squeeze main contrib non-free
deb-src http://ftp.jp.debian.org/debian squeeze main contrib non-free
deb http://security.debian.org squeeze/updates main contrib non-free]
--

# apt-get update
# apt-get upgrade
# apt-get install udev openssh-server
(システムに必要なudev、ログインに必要なsshdをインストール)

# vi /etc/network/interfaces
(ネットワーク設定、DHCPでアドレスを取るようにしておく)
--
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
--

# vi /etc/fstab
(マウントポイントを設定しておく)
--
proc /proc proc defaults,nosuid,noexec 0 0
/dev/sda1 /boot ext3 defaults,rw 0 0
/dev/sda2 swap swap defaults 0 0
/dev/sda3 / ext3 defaults,rw 1 1
--

# apt-get clean
# exit

設定したらchrootを抜け、カーネルモジュールを配置する。
今走ってる/lib/modules/2.6.28 をコピーしてもいいし、前作ったtgzが残っていればそれを展開してもいい。
# mkdir -p /opt/landisk/squeeze/lib/modules
# cp -arp /lib/modules/2.6.28 /opt/landisk/squeeze/lib/modules
あるいは前回のlib.tgzを使って
# tar xvfz lib.tgz -C /opt/landisk/squeeze

最後に、tarで固めて、ファイルをどこかに取っておく。
# umount /opt/landisk/squeeze/proc
# tar cjvf /opt/landisk/squeeze-rootfs.tar.bz2 .
(squeeze-rootfs.tar.bz2 このファイルはどこかに取っておく)


3. HDDを取り外して別マシンでマウント、作ったtarを展開
HDL-GXRをシャットダウンしてストレージを取り外し、別のPCに接続(ここでは取り付けたHDDがsdbの前提)。
バックアップを取っておくなら
# mount /dev/sdb3 /mnt
# cd /mnt
# tar cjvf /export/landisk/lenny-rootfs-backup.tar.bz2 .
# cd /
# umount /mnt

こんな感じ。
しかる後、sdb3 を新しいものに入れ替える。
# mkfs.ext3 /dev/sdb3
# mount /dev/sdb3 /mnt
# tar xvfj /export/landisk/squeeze-rootfs.tar.bz2 -C /mnt
# umount /mnt


4. HDL-GXRに繋いでブート
うまくいけば、めでたくHDL-GXRがSqueezeになっているはずである。

作ったカーネルとrootfsを一応置いておく。簡単なまとめはこちら
カーネルとモジュールは、iptables関係・ipv6・USBウェブカム・USB無線LANなど、ごちゃごちゃと要らない物も入っているので、作り直した方がいいかも。

kernel hdl-gxr-kernel-2.6.28-20140308.tar.bz2
rootfs hdl-gxr-squeeze-rootfs-20140308.tar.bz2
これをディスクに放り込めば、とりあえずSqueezeが動く。はず。
続きを読む
posted by usoinfo at 17:32 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2013年11月12日

Firefoxの個人証明書をエクスポートしたらOpera12にインポートできない

StartSSLでSSLの証明書を作ろうと思ってサインアップしたら、個人認証のために個人証明書を作成してインストールした。この作業をFirefoxでやったので、Operaでもアクセスできるように証明書をエクスポート&インポートしようとしたら、Opera12が「証明書チェーンが正しく順序付けられていませんでした」とかなんとか言って拒否する。意味がわからん。パスワードは合ってるし、Operaで.p12を食う処理に問題があるのだろうか。

ちょっと困ったが、FFでエクスポートしたp12を、一度IEにインポートしてエクスポートしてから、そのファイルをOpera12に食わせたら、うまくいった。PKIX業界はカオスでよく分からない………
posted by usoinfo at 09:03 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2013年08月09日

phpDocumenter2 を使う

PHPのソースコードからドキュメントを生成したい。Javaにはjavadocがあるように、PHPにもそのようなものがある。というわけで、PHPのドキュメンテーションツール、phpDocumentor version2( http://phpdoc.org/ )を使用する。
まず、PHPでXSLが有効になっていないと使用できない。phpコマンドで調べる。
% php -r "phpinfo();" | grep XSL
XSL => enabled
EXSLT => enabled
enabledになっていない時は、libxsltをインストールして、--with-xsl を付けてPHPをビルドし直すなどする。CentOSなら、libxsltはyumでインストールできる。

phpDocumenterはpearからインストールする。また、実行にgraphvizが必要なので、これもインストール。
# pear channel-discover pear.phpdoc.org
# pear install phpdoc/phpDocumentor
# yum install graphviz
インストールできたら、コマンドを叩くだけ。
% phpdoc -d src -t docs \
--extensions php,phps --encoding EUC-JP \
--ignore-symlinks --title "MyPHPAPIDocument"
--template zend
-d にソースファイルのあるディレクトリ、-t にドキュメントを生成するディレクトリを指定。--extensions は、解析するソースファイルの拡張子を設定し、ソースがUTF-8以外の文字コードで書かれていれば --encoding を指定。テンプレートの種類を変えたければ --template で指定。
生成ができれば、出力されたディレクトリのindex.htmlをブラウザで開けばOK。Javadoc風のコメントからドキュメントが生成されているはずだ。
タグ:PHP phpdoc
posted by usoinfo at 09:56 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2013年08月01日

MySQL スレーブが Errno 1872 で停止した時の対処

MySQLのスレーブが走っているマシンを再起動したら、スレーブがエラーを吐いて止まってしまった。
Last_Errno は 1872。
ドキュメントによれば、

(http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html)
Error: 1872 SQLSTATE: HY000 (ER_SLAVE_RLI_INIT_REPOSITORY)
Message: Slave failed to initialize relay log info structure from the repository
ER_SLAVE_RLI_INIT_REPOSITORY was introduced in 5.6.12.

とのこと。
何らかの理由で、リレーログが読めなくなってしまったか何か?

この時は、MySQLは上がっていて、スレーブのステータスもとれるので、SHOW SLAVE STATUSで最後の状態を調べる。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: ***.***.***.***
Master_User: ********
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
:(略)
Last_Errno: 1872
Last_Error: Slave failed to initialize relay log info structure from the repository
Skip_Counter: 0
Exec_Master_Log_Pos: 4840135
:(略)
1 row in set (0.00 sec)
で、Master_Log_FileExec_Master_Log_Posを見る。ここまでマスターのバイナリログの実行が終わっているので、一旦スレーブをリセットして、ここから再開させる。

RESET SLAVE;

CHANGE MASTER TO
MASTER_HOST='***.***.***.***',
MASTER_USER='********',
MASTER_PASSWORD='********',
MASTER_LOG_FILE='mysql-bin.000009', // Master_Log_Fileのファイル名をセット
MASTER_LOG_POS=4840135; // Exec_Master_Log_Posの値をセット

START SLAVE;
これで、スレーブが再開するか確認。
今回はこれで動き出したようだ。ふう。
タグ:MySQL
posted by usoinfo at 07:19 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2013年07月23日

CentOS6にmuninをインストール。ついでにApacheとMySQLも監視。

dump-munin-20130723.png
この画像の例のように、muninでサーバーを軽く監視しておきたいので、インストールしようと思う。

1. muninはepelからインストールするので、入れてなければ EPELを設定。
http://mirrors.fedoraproject.org/publiclist/EPEL/
ここから適当なミラーを選ぶと良いが、どこかのミラーから epel-release-6-8.noarch.rpm を入れる。
% su
# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
...
# vi /etc/yum.repos.d/epel.repo
...
enabled=0 (デフォルトではepelを見に行かないようにしておく。この辺はお好みで。)
...

2. 次に、muninとmuninに必要なものをインストール。
# yum install --enablerepo=epel munin munin-node
...(いろいろたくさんパッケージが入る)
# service munin-node start (とりあえず起動)

3.Webからmuninを見えるように設定。
設定を直接httpd.confかVirtualHostの中に書いても良いし、conf/extra/munin.conf などに分けてincludeしてもいい。インストールしたmuninでは、/var/www/html/munin にファイルが生成されるので、Aliasを切る。必要なら認証もかける。
Alias /munin /var/www/html/munin
<Directory "/var/www/html/munin">
AuthUserFile ***passwdfile_path***
AuthName ByPassword
AuthType Basic
Require valid-user
</Directory>
こんな感じ。
/var/log/munin 以下にmuninのログがあって、munin-update.log あたりを覗くと、ちゃんと動いているかどうか分かる。5分に1回走るので、15分くらいしたら、http://****/munin にアクセスすると、グラフが見える。はずだ。

4.ついでに、Apacheも監視してみる。
まず、もし plugins にシンボリックリンクが張ってなかったら、こんな感じで張る。
ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
次に、muninがApacheからserver-statusを取れるように、Apacheを設定。httpd.confにでも、こんな感じの設定を追加。
# vi httpd.conf
...
LoadModule status_module modules/mod_status.so (もしコメントアウトされていれば有効化)
...
<Location /server-status>
AddDefaultCharset EUC-JP
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

ExtendedStatus On
Apacheを再起動したら、コマンドラインで動作をテストしてみる。
# munin-run apache_accesses
accesses80.value 0
value が U になっている時は、うまくserver-statusが取れてないと思われるので、'curl http://127.0.0.1/server-status' などと手動で実行してみて、apacheの設定が正しいか確認しよう。値が取れていれば、munin-node を再起動して、しばらくするとmuninのグラフに見えるはず。

5.さらに、MySQLも監視してみる。
もし入ってなければ perl-DBD-MySQL をインストール。
# yum install perl-DBD-MySQL

そして、plugins の下にシンボリックリンクを張る。必要なものだけ張ればいいと思うが、ここではとりあえず全部盛りとした。
ln -s /usr/share/munin/plugins/mysql_bytes /etc/munin/plugins/
ln -s /usr/share/munin/plugins/mysql_queries /etc/munin/plugins/
ln -s /usr/share/munin/plugins/mysql_slowqueries /etc/munin/plugins/
ln -s /usr/share/munin/plugins/mysql_threads /etc/munin/plugins/
(ここまでの4つと、ここから下は、オプションで必要な設定が異なるらしい)
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_commands
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_innodb_bpool
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_innodb_io
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_innodb_log
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_innodb_tnx
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_select_types
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_table_locks
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_connections
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_slow
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_network_traffic
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_qcache
ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_qcache_mem
監視されるMySQL側には、muninでアクセスするアカウントを作成(既存のアカウントを使うのであれば不要)。
% mysql -h 127.0.0.1 -u root -p
...
mysql> GRANT ALL PRIVILEGES ON *.* TO 'munin'@'127.0.0.1' IDENTIFIED BY 'mypassword!!' WITH GRANT OPTION;
そして、munin-nodeがmysqlにアクセスできるように /etc/munin/plugin-conf.d/munin-node に設定を追加。
# vi /etc/munin/plugin-conf.d/munin-node
...(以下を追加)
[mysql*]
env.mysqladmin /usr/local/mysql/bin/mysqladmin (mysqladminへのパスを書く)
env.mysqlopts -u munin -pmypassword!! -h 127.0.0.1 --port=3306 (さっき設定したアカウントまたは既存のアカウント)
env.mysqlconnection DBI:mysql:mysql;host=127.0.0.1;port=3306
env.mysqluser munin
env.mysqlpassword mypassword!!
上2行は mysql_bytes から mysql_threads まで、下3行は mysql_ のプラグインに必要な設定のようで、両方必要のようだ。

設定したら、munin-run で動作確認。
# munin-run mysql_queries
Warning: Using a password on the command line interface can be insecure.
delete.value 373
insert.value 3025
replace.value 0
select.value 7018
update.value 177
cache_hits.value 0
# munin-run mysql_commands
Com_delete.value 373
Com_insert.value 3025
Com_insert_select.value 0
Com_load.value 0
Com_replace.value 0
Com_replace_select.value 0
Com_select.value 7018
Com_update.value 177
Com_update_multi.value 0
追補
MySQLとmuninのバージョンの組み合わせによっては、/usr/share/munin/plugins/mysql_ 系の各コマンドで、"Unknown section: INDIVIDUAL BUFFER POOL INFO at /etc/munin/plugins/mysql_**** line xxxx." のエラーが出て動作しないことがある。
これは、MySQL の SHOW ENGINE INNODB STATUS に、muninが読解不能のセクションが含まれているのが原因の模様。とりあえずの回避策として、当該のセクションをスキップするように変更。
# /usr/share/munin/plugins/mysql_
(1084行目あたり)
...
'TRANSACTIONS' => \&parse_transactions,
'BACKGROUND THREAD' => \&skip,
'INDIVIDUAL BUFFER POOL INFO' => \&skip,
);
...
これでスキップされるはずだ。

6.仕上げ
設定できたら、munin-node を再起動。ついでに、OSのブート時にmunin-nodeが起動するように設定しておく。
# service munin-node restart
# chkconfig --add munin-node
# chkconfig munin-node on
posted by usoinfo at 10:50 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

2013年01月29日

デバイスを引っこ抜いたらWindowsをシャットダウンするアプリ

 また、どこに需要があるのか不明なアプリを作ってしまったが…。デバイス接続状態を検出してWindowsを制御するアプリである。
これ

【そもそもは】
 携帯で再生した音楽を、WindowsPCのBluetoothでA2DPで受けて、スピーカーから再生するようにする(先日のやつを車から出してきて、シームレスに使おうという肚である)。で、使うと、間違いなくWindowsのシャットダウンを忘れて電気を無駄遣いするのが容易に予想される。そこで、Bluetoothのデバイスを監視して特定のペアリングが切れたらシャットダウンを発行するアプリがあればいいんじゃないかろうかと思いつく。で、探してみたけどどうもなさそうなので、じゃあ手っ取り早く作るかと思って、コードを書き始めた。
 だが、Bluetoothは(自作に)よくない。
 Bluetoothのスタックが何種類も(Microsoftのと、東芝のと、WIDCOMMのと、BlueSolielのと。他にもあるのかもしれん)あって、それぞれAPIもSDKも別である。簡単に使えるのはMSの標準で付いてるスタックだが、MSスタックではA2DPが食えない。家のはWIDCOMMスタックを入れてA2DPを動かしたが、当然MSのAPIでは扱えない。いちいちSDKをゲットしてドキュメントを読んで、結局WIDCOMM専用のアプリにしかならないと思うと気力が萎えて、沙汰止みとした。
 
【思い直した】
 単にデバイスがあるかどうかが取りたいだけなのにになんでこんなに困難なんだと思っていたが、後日気がついた。
 Blutoothとかは関係なく、Windowsに接続されているデバイスを直接見れば何とかなるんじゃない?それだとBluetooth以外のデバイスにも対応できるし、その方が汎用じゃない?
 具体的には、SetupDiEnumDeviceInfoしてSetupDiGetDeviceRegistryPropertyして、さっきと今を比べたら、デバイス引っこ抜いたのが分かるんじゃない?

 と、いうわけで、ざくざくとアプリを作ってみた。
 特定のデバイスを引っこ抜いたり、接続したりした時に、それに反応して、シャットダウン/ログオフ/サスペンド/休止状態/パワーオフまたはユーザー定義アプリを実行する。
 定期的にデバイス一覧を取っては比較、デバイスのユニークネスは、SPDRP_CLASSGUIDSPDRP_HARDWAREIDの0番目で見る。従って、着脱時にデバイスマネージャーに出没して、HARDWAREIDがユニークなデバイスなら、使用可能のはずである。例えばUSBメモリースティックとかね。


 携帯をBluetoothをA2DPでペアリングすると、音量とかを操作するヤツがHIDデバイスで出没するので、こいつを捉えて初期の目標を達成した。他にどんな使い道があるのか分からないが、せっかく作ったので公開しておく。

ByDHalt デバイス接続状態を検出してWindowsを制御


 誰かの役に立てば幸い。

posted by usoinfo at 17:28 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

2013年01月11日

電源連動音楽プレーヤー

 自動車の運転中に音楽を流すのに、長いことWindowsCEベースのPDAを使い、GetSystemPowerStatusで給電が止まったらサスペンドする自作ソフトを走らせて、エンジンが止まったら再生が止まりエンジンを掛けたら止まったところから再開されるようにしていたのだが、そのPDAが壊れてしまった。もう古いアーキテクチャであるから、中古市場にも格安のWinCEベースのデバイスは出回っていないので、調達することもできない。
 そんな古いものをいつまでも使っていたのは理由があって、自動車内で普通のメモリプレーヤーを使おうとしても、これがなかなかうまくないからである。してほしいことは単純で、エンジン切ったら止まり、エンジン掛けたらそこから再生してくれればいいのであるが、電源が切れたら再生を中断するようなメモリプレーヤーは、全然ないのである。これでは車から降りるときいちいち停止ボタンを押さなくてはならない。当然のように押し忘れるので、再生位置をロストして悲しいことになる。
 じゃあというので、Androidのアプリでそういうものがないのかと探したが、探し方が悪いのか、あんなに山のようにアプリがあるのに、給電が切断されたら一時停止、という、ごく簡単な機能を持つプレーヤーのアプリがないのである(イヤホンジャックを抜くと一時停止、というのはある。VideoLAN for Androidとか。)
 
 こうなれば是非もない、ないのならば自分で作るほかあるまい、ということで、Android用の電源状態に連動する音楽プレーヤーアプリを作った。ごくシンプルなプレーヤーである。自動車内で触らずに音楽を流す、という用途しか考えていない。ボタンがやたらとデカいのは、運転席上での操作が前提だからである。

cap_jp_net_usost_einterlockplayer_free.png


 シガーソケットからUSBを取るやつと電源ケーブルをつないで再生して、エンジンを切ると給電がオンからオフになるので再生を停止する。エンジンを掛けるとオフからオンになるので再生を再開する。これで停止ボタン押し忘れの呪いから解放されるはずである。 
 せっかく作ったので、今回GooglePlayにデベロッパー登録してアプリを公開してみた。



 デベロッパー登録は、$25かかるのな。なんかでアプリで収益をあげて、せめて登録料分くらいは取り返したいものだが。
posted by usoinfo at 19:14 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

PHPでそのホストで実行中のプロセス一覧を取得(Linux)

バックグラウンドで処理をさせていた時など、特定のコマンドやらpidやらのプロセスがあるかどうかを調べたい時があるので、ぱぱっと。
function Unix_GetPidArray()
{
$ret = array();
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
$line = ltrim($line);
$pos = strpos($line, " ");
$pid = intval(substr($line, 0, $pos));
$args = substr($line, $pos+1);
if( $pid <= 0 ) continue;
$ret[] = array(
'pid' => $pid,
'args' => $args,
);
}
fclose($fp);
return $ret;
}
実行結果例
$r	= Unix_GetPidArray();
echo var_dump($r);
--
Array
(
[0] => Array
(
[pid] => 1
[args] => /sbin/init
)
[1] => Array
(
[pid] => 2
[args] => [kthreadd]
)
[2] => Array
(
[pid] => 3
[args] => [migration/0]
)
[3] => Array
(
[pid] => 4
[args] => [ksoftirqd/0]
)
...略
ps -eを実行した結果をバラして格納しているだけである。/bin/ps -e -o pid,args を実行してみて、[プロセスID]半角スペース[コマンド....]の書式になればそのまま使用可能。違ったときは環境に合わせて$cmdを調整。
応用で、プロセスID(int値)を与えるとそのpidがあるかどうか(ps -ef|grep 1111|wc -l 的なもの)、文字列を与えるとその文字列を持つコマンドのプロセスIDを列挙(ps -ef|grep ahoaho 的なもの)の関数。
function Unix_IsPidExisted($pid)
{
$ret = false;
$cmd = "/bin/ps -e -o pid";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
if( intval(trim($line)) === $pid ){
$ret = true;
break;
}
}
fclose($fp);
return $ret;
}

function Unix_GetPidStringMatched($str)
{
$ret = array();
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
if( strpos($line, $str) === FALSE ) continue;
$ret[] = intval(substr(ltrim($line), 0, strpos(ltrim($line), " ")));
}
fclose($fp);
return $ret;
}

/*
実行例:

$ret = Unix_IsPidExisted(4566);
// PID 4566 が存在すれば true が返る

$ret = Unix_GetPidStringMatched('httpd');
// args に httpd を含むPIDを列挙した配列が返る

*/

タグ:Linux PHP
posted by usoinfo at 09:28 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする