CGIでシリアル送信のプログラムを実行しようとしたら引っかかった

先日に続いてまたシリアル通信関係で困ってしまいました。


今回はクライアントが実行したphpからシリアル通信を行うCGIプログラムを実行するという仕組みを作ろうとしました。
phpはこんな感じです。exec関数でコマンドを実行してるだけです。serialSendはこの間のプログラムのようなものです。

<?php
	exec("./serialSend");
?>

いざwebプラウザからこのphpにアクセスしてみてもデータは全く送信されません。
コマンドラインから
php send.php
と実行してみるとうまくいきます。
apacheCGIの設定が変かなとかファイルの実行権限あたりが原因かななどいろいろ試行錯誤してみても一向に状況は変わりませんでした。
apacheのエラーログを見てみればいいじゃん!とふと思い出して見てみたところ、このようになってました。


・/var/log/apache2/error.log
[Tue Aug 24 01:08:58 2010] [error] [client 192.168.1.4] File does not exist: /var/www/favicon.ico
/dev/ttyUSB0: Permission denied


なんと/dev/ttyUSB0に権限がないとのことで、完全に予想していなかったところに問題がありました。
実際に確認してみると、


・ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 2010-08-24 02:15 /dev/ttyUSB0


と、まさにエラーログで言われたとおりでした。
そこで/dev/ttyUSB0に対して実行権限を付加したところ、webプラウザからphpの実行でちゃんと実行されるようになりました。
毎回Ubuntuを起動し直す毎に設定するのが面倒なので、/etc/rc.localに以下の記述を加えてコンピュータ起動時に実行権限を付加するようにしました。


chmod 777 /dev/ttyUSB0


コメントを頂いたので追記
権限を777にする必要はありませんでした。実行権限は不要で、666で問題ありません。