web-dev-qa-db-ja.com

PHPでwww-dataとして実行されるcrontabジョブを設定する方法は?

私のサーバーはUbuntu 14.04とnginxで実行されています。私の問題はCronです。ファイル(cron.txtを使用してそれを開始します(crontab)、その内容:

_* * * * * /usr/bin/php /var/www/html/test.php >> /var/log/cron.log
_

_crontab /var/www/html/cron.txt_コマンドを使用して実行すると、完全に機能し、スクリプトtest.phpが実行されています。しかし、PHPスクリプト(ブラウザ経由で実行))を使用して同じことを行うと、exec('crontab /var/www/html/cron.txt');は機能しません。

コマンドによる現在のcronjobの確認:_crontab -l -u www-data_、ファイルからの行は表示されますが、Cronはそのジョブを実行しません。多分それはいくつかの許可の問題に関連していますか?ルートとして実行することによってのみ機能するためです。 Cronにwww-dataのタスクも実行させる方法はありますか?

3
BociucH

何を成し遂げようとしているのかよくわかりません。私が理解している限り、あなたはwww-dataユーザーとしてcronジョブを実行する必要があります。通常(強くお勧めします)www-dataユーザーはシェルにアクセスできません。ただし、cronタスクをwww-dataとして実行し、次のようにルートcronにタスクを配置できます。

* * * * * su www-data -s /bin/bash -c "/usr/bin/php /YOUR_PATH/task.php"

システムのすべてのcronジョブが1つのファイルに集中しているため、これもクリーンな方法ですが、各タスクは必要なユーザーとして(適切なアクセス許可と属性で)実行されます。

* * * *パラメータを変更して、ジョブのスケジュールを調整できます。私の例では、1分ごとに実行されます。

それが役に立てば幸い。

3
patan90

あなたは奇妙な何かが欲しい。 PHPスクリプトからcrontabを実行する理由Crontabは時間ベースのジョブスケジューラであり、phpスクリプトから実行しないでください。 cronjobをwww-dataとして開始する場合は、crontab -u www-data -eコマンドで構成する必要があります。その後、構成したとおりにジョブが実行されます。

1

Nextcloudにも同じことが必要です。インストーラーでCronジョブをセットアップするためにPHP=)を取得できず、Linux管理者がそれを実行するように要求できないようです。

だから、あなたの最初のQ:www = data crontabジョブを設定するためにPHPをどのように使用しますか?A:必要ありません。シェルから実行する必要があります。

2番目のQ:crontabはwww-dataジョブを実行できますか? A:完全にですが、その部分はcrontabジョブのセットアップ時に行われます。 www-dataを使用してcronファイル内からcronジョブを実行することはお勧めできません。www-dataにcrontabジョブ自体を実行させるだけです。

これが私がそれを機能させた方法です:

  1. 文字列はおそらく次のようになります。

* * * * *php -f/var/www/html/test.php >> /var/log/cron.log

  1. www-dataはCronユーザーとして気難しいです。

ターミナルから、次のようにCronをセットアップします。

root...として実行中

crontab -u www-data -e ... Qと同様に、実行する文字列を追加します。

...しかし、あなたはPHPを使用してcrontabジョブを設定したいと思っています。これはPHPインストーラだと思います。)= PHPアプリがcrontabジョブをセットアップできない可能性があります。それは良い考えではないかもしれません。もし可能であれば、Nextcloud開発者に知らないようにしてください。どのように。

0
Jesse Steele

私は何とかやり遂げました。最初の投稿のコードはすべて問題ありません。唯一知っておくべきことは、www-dataユーザーが/var/logへの書き込みを許可されていないため、そこに出力します。さらに、私のPHPスクリプトでは、ファイルを作成してそこに何かを書き込もうとしていました。そのためには、絶対パスが必要であるため、次のようになります。

dirname(__FILE__) . '/myfile.txt';

これらの変更後、すべてが期待どおりに機能します。

0
BociucH