

local環境で cron で定期実行するように作成しました。それ自体は問題なく動作しています。  
そして、デバッグ用に随所でログを出力しています。 `log::debug()`

ログファイルは管理しやすいように日毎に出力しています。

[code]

    // .env
    LOG_CHANNEL=daily
    
[/code]

ここで問題になるのが、 **新規ログファイルをcron実行時に作成されるとオーナーが root** になり、その後に
**通常アクセスによるログを出力しようとすると`サーバー500エラー`** になります。

最初、サーバーエラーが発生するのにログが残っていない、という状態に混乱しました。  
ログが書き込めないから、ログが残らない。理由がわかると納得です。

## cron を実行してる環境

  1. `sail artisan sail:publish` にてDockerfileフォルダと関連ファイル作成
  2. Dockerfileフォルダ内のphpバージョンにある supervisord.conf にcron を追加

[code]

    [program:cron]
    command=/usr/sbin/cron -f -l 8
    autostart=true
    stdout_logfile=/var/log/cron.out.log
    stderr_logfile=/var/log/cron.err.log
    
[/code]

  3. `scheduler` ファイルを作成して定期実行の命令を記入

[code]

    * * * * * root cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1
    
[/code]

  4. Dockerfileを開いて RUN に `cron` という文字を追加

[code]

    RUN apt-get update \　
        && apt-get install -y cron 以下略
    
[/code]

  5. 同じDockerfileの COPYの前に cron の RUN を追加

[code]

    COPY scheduler /etc/cron.d/scheduler
    RUN chmod 0644 /etc/cron.d/scheduler \
        && crontab /etc/cron.d/scheduler
    
[/code]

## cron の実行者を変更をやってみましたが…

新しいファイルのオーナーが root になってしまう問題が発生したので、cron 実行者を変更するようにしてみました。

Dockerfileのcron実行部分に USER を指定しました。

[code]

    // docker/8.2/Dockerfile
    USER my_name  // ←←←←←←←←←← これを追加
    COPY scheduler /etc/cron.d/scheduler
    RUN chmod 0644 /etc/cron.d/scheduler \
        && crontab /etc/cron.d/scheduler
    
[/code]

しかし、この設定をしても root でファイルが作成されます。

毎日、オーナー変更のコマンドを実行しなければなりません。

[code]

    sudo chown my_name:my_name laravel-*.log
    
[/code]

この状況を改善する方法はあるでしょうか？  
よろしくお願いします。

**追記 2023-06-25 0:47 **  
次の施策も試しみました。  
いずれもNG。rootで作成されてしまい目的を達成できていません。

  1. Dockerfile COPYの前に `USER my_name` を追加
  2. Dcokerfile `RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 my_name` を追加
  3. Dockerfile `RUN chmod 0644 /etc/cron.d/scheduler \(改行)&& crontab -u my_name /etc/cron.d/scheduler` に変更
  4. `* * * * * root /bin/su my_name -c "cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1"` に変更
  5. さらに後ろに `&& chown my_name:my_name /home/my_name/my_project/storage/logs/*.log"` を追加
  6. start-container に `if [ "$(id -u)" = '0' ]; then（改行）exec su - imamura "$0" "$@"（改行）fi` を追加


CC BY-SA 4.0
2023-06-23T22:28:47.257
95339
2023-06-24T17:59:05.133
2023-06-24T15:53:32.787
7980
7980
question
docker laravel cron
Laravel10で cron を実行すると log のオーナーが root になってしまう


特定のユーザーで実行するには `/etc/crontab` ではなく `/var/spool/cron/[user]` で設定行うとよいはず  
~~(設定内容は同様に)~~

あるいは以下のような記述方法も考えられます (コマンドの指定部分)

[code]

    /bin/su user -c "command"
    
[/code]

* * *

#### 記述の方法

特定のユーザーでの (通常の) CRON ファイルの記述では  
ユーザー名フィールドは **なく** , 日時などの 5項目の後にコマンド

システム CRON ファイルの場合の記述は  
**ユーザー名フィールドがあり** , 続いてコマンド

なので `root` と指定している部分を変更するとよいかも

また `/var/spool/cron/[user]` の(通常の) CRON ファイルでは  
該当するユーザーで, 以下のようにして編集するとよいでしょう

[code]

    $ crontab -e
    
    $ crontab -l   # 内容確認
    
[/code]


CC BY-SA 4.0
2023-06-24T06:27:56.893
95349
2023-06-24T17:59:05.133
2023-06-24T17:59:05.133
43025
43025
95339
answer