ForegroundでCronを実行した時に処理の標準出力,標準エラー出力をCronの標準出力,標準エラー出力にリダイレクトする

ForegroundでCronを実行した時にCronで実行される各処理の標準出力,標準エラー出力に出力した内容は、 Cronの標準出力,標準エラー出力に出力されずにいずこかへ消えます。 今回は、各処理Cronの標準出力,標準エラー出力にリダイレクトして出力させます。

先に答えを書いておくと /proc/{CronのプロセスID}/fd 配下の12にそれぞれを出力すればOKです。

* * * * * /main.sh >/proc/$(</var/run/crond.pid)/fd/1 2>/proc/$(</var/run/crond.pid)/fd/2

/proc/{CronのプロセスID}/fd/1 などは、/dev/pts/1 などのデバイスファイルのシンボリックファイルなので、 procfsが実装されていない環境では、lsofから標準出力,標準エラー出力のデバイスファイルのパスが取得できます。 そのパスに出力すれば似たような挙動を得られます。

ただし、このやり方はrootユーザでの話なので、別ユーザで実行する場合については別記事で書こうかなと思います。

環境

今回はprocfsが使えるLinuxで検証したかったので、以下のDockerfileで環境を作ってコンテナ上でcron -fを実行して確認しました。

FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install --no-install-recommends -y cron vim && \
    rm -rf /var/lib/apt/lists/*

CMD ["bash"]