web-dev-qa-db-ja.com

WWW-DATAによって作成されたcronタスクが実行されないのはなぜですか?

Ubuntu 14があり、PHPコードを使用していくつかのcronジョブを作成したい。

現在、私はcrontab -u www-dataのようなことをしており、PHPコードからcrontabに書き込むことができます。

crontab -u www-data -eを実行すると、いくつかのコマンドが表示されますが、これらのコマンドは実行されていませんが、同じコマンドをcrontab -eに(ユーザーを指定せずに)追加すると、正常に実行されます。

Cronファイルには、末尾に必須改行もあります。

TL; DR:ユーザーwww-dataによって作成された作業cronジョブを機能させるにはどうすればよいですか?

編集:1

解決策:クリックして解決策を見る

2
Umair

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

Cronで実行されるPHPスクリプト

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を使用すると、侵害されたサーバーはサーバーにのみアクセスできます。バックアップすると、サーバー全体を処理するよりも簡単に修正できます。

4
L. D. James

これは、伝統的に(そして非常に優れたセキュリティ上の理由から)www-dataユーザーがWebサービス以外の操作を許可されていないためです。ログインなし、cronジョブなし、n。

$ getent passwd www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

ジョブフローを再考します。www-dataとして実行しないでください。

2
waltinator

私は解決策を見つけました。次を入力してcronlogsを確認しました

Sudo grep CRON /var/log/syslog

メッセージ“(CRON) info (No MTA installed, discarding output)”を見ました

つまり、メールをインストールする必要がありました。

そこでSudo apt-get install postfixを実行しましたが、今ではすべてが機能しています。

1
Umair

ユーザー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は自分自身を管理することを好むため、眉をひそめます。

0
Jesse Steele