Ubuntu 14があり、PHPコードを使用していくつかのcronジョブを作成したい。
現在、私はcrontab -u www-data
のようなことをしており、PHPコードからcrontabに書き込むことができます。
crontab -u www-data -e
を実行すると、いくつかのコマンドが表示されますが、これらのコマンドは実行されていませんが、同じコマンドをcrontab -e
に(ユーザーを指定せずに)追加すると、正常に実行されます。
Cronファイルには、末尾に必須改行もあります。
TL; DR:ユーザーwww-data
によって作成された作業cronジョブを機能させるにはどうすればよいですか?
編集:1
解決策:クリックして解決策を見る
Cronはwww.dataアイテムを実行します。次の簡単なテストでこれを確認できます。
$ Sudo crontab -u www-data -e
このエントリを追加します。
* * * * * date >> /tmp/date.out
ここで、出力を調べます。
$ tail -f /tmp/date.out
Crontabが機能していることを確認するためにそれを行った後、実行したい実際のスクリプトを操作できます。
ユーザーwww-data
は同じパスではないため、アカウントから機能する多くのコマンドは、そのスクリプトのパスを特に設定しない限り、www-data
ユーザーからは機能しません。 www-dataのデフォルトパスには次のもののみが含まれます:PATH=/usr/bin:/bin
これを行うには、パスリストをエクスポートしてから、スクリプトのパスリストに配置します。
これを行うには:
$ echo $PATH > ~/mypath.txt
スクリプトの先頭に〜/ mypath.txtのテキストを次のように追加します。
あなたのスクリプト:
#!/bin/bash
export PATH=$PATH:/home/users/l/j/ljames/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# rest of your script code here.
私の例のように、使用しないいくつかの明らかな項目を削除することで、パスを微調整できます。
/home/users/l/j/ljames/bin
/usr/games
/usr/local/games
/snap/bin
これにより、スクリプトのパス行が次のようになります。
#!/bin/bash
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ... rest of your script code here
PHPテストスクリプト(/home/users/l/j/ljames/test.php
)
#!/usr/bin/php
<?php
$string=`date`;
print "Output from PHP script: $string";
?>
php crontabエントリ
* * * * * php /home/users/l/j/ljames/test.php >> /tmp/date.out
以下を使用して出力を調べることができます。
$ tail -f /tmp/date.out
Output from PHP script: Fri Feb 3 14:46:01 EST 2017
Output from PHP script: Fri Feb 3 14:47:01 EST 2017
Output from PHP script: Fri Feb 3 14:48:01 EST 2017
出力はcrontabがphpスクリプトを実行することを確認します。犯人が実際のスクリプトであり、最初にcronの外部で適切に機能するためにデバッグする必要があることを示しています。犯人として考えられるのは、環境のパスリストです。
注:
ユーザーwww-data
として実行されるWebサーバースクリプトを使用するシステムは、run-as youまたはrootである場合よりも安全です。それらがあなたのものである場合、スクリプトはあなたがアクセスできるすべてのものにアクセスでき、Webサーバーが危険にさらされた場合、Sudo
でrootアクセスさえできるかもしれません。 Webサーバースクリプトrun-aswww-data
を使用すると、侵害されたサーバーはサーバーにのみアクセスできます。バックアップすると、サーバー全体を処理するよりも簡単に修正できます。
これは、伝統的に(そして非常に優れたセキュリティ上の理由から)www-data
ユーザーがWebサービス以外の操作を許可されていないためです。ログインなし、cronジョブなし、n。
$ getent passwd www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ジョブフローを再考します。www-data
として実行しないでください。
私は解決策を見つけました。次を入力してcronlogsを確認しました
Sudo grep CRON /var/log/syslog
メッセージ“(CRON) info (No MTA installed, discarding output)”
を見ました
つまり、メールをインストールする必要がありました。
そこでSudo apt-get install postfix
を実行しましたが、今ではすべてが機能しています。
ユーザーwww-data
がcronジョブを適切に実行するには、このファイルが存在する必要があります。
/var/spool/cron/crontabs/www-data
許可付き:
-rw------- 1 www-data crontab
これはそれを達成するはずです(上記):
Sudo crontab -u www-data -e
...必要なものを追加します。
許可が正しくない場合は、次を使用します。
Sudo chmod 600 /var/spool/cron/crontabs/www-data
Sudo chown www-data:crontab /var/spool/cron/crontabs/www-data
このファイルを直接編集することは、たとえそれが機能していても、cron
は自分自身を管理することを好むため、眉をひそめます。