という話

技術ブログにしたい

リダイレクトするときにfile descriptor out of range: Permission denied

crontabにタスク書いたのに実行されなかったときのメモ。
エラー内容をコピペしてググっても全く出てこないので。

PHPで作ったタスクに

*/5 * * * /usr/bin/php test.php 12345>>/var/log/test.log 2>>/var/log/test_error.log

みたいな感じでcrontabに書いたんですが全く実行されませんでした。


ログとか確認しても何も出ないので何でかなーと思ってたんですが、これをこのままコピペして貼り付けたらエラーが出ました

$ /usr/bin/php test.php 12345>>/var/log/test.log 2>>/var/log/test_error.log
file descriptor out of range: Permission denied

直訳すると範囲外の数字です的なエラーですね。

原因

標準ストリームのファイル記述子として認識された。
標準出力は1、標準エラー出力は2みたいな感じで12345もストリームと認識されたんだと思います。

解決法

引数とリダイレクトの間にスペースを入れる。

$ /usr/bin/php test.php 12345>>/var/log/test.log 2>>/var/log/test_error.log

これを

$ /usr/bin/php test.php 12345 >>/var/log/test.log 2>>/var/log/test_error.log

こうする。わかりづらいですね。
もしくは文字列とする

$ /usr/bin/php test.php "12345">>/var/log/test.log 2>>/var/log/test_error.log


文字列の場合はストリームのファイル記述子とは認識されませんでした。