web-dev-qa-db-ja.com

CronおよびBashシェルスクリプトを使用して$(date)をファイルに書き込む

MacOS 10.14.3でゲストとして実行されているUbuntu 18.04。ハイパーバイザー:VMWare Fusion 10

目的:毎分、日付/時刻をファイルに追加します

ステータス:スクリプトは毎分実行され、空白の新しい行をテキストファイルに挿入します。日付は含まれていません。それが問題だ

Crontabのアカウントと同じアカウントを使用してコマンドラインからスクリプトを実行すると、ファイルに日付が追加されますが、問題ありません。

明らかな問題:ファイルへの日付のエコーはコマンドラインから機能しますが、cronからの同じコマンドは日付を生成しません

これは、cronで毎分実行されるスクリプトです。

#!/bin/bash
#append_date_to_file.sh
target_file='/home/dan/timestamps'
echo $(date)  >>  $target_file

これはcronエントリです

crontab -e

PATH=/bin/bash:
*       *       *       *       *       /home/dan/append_date_to_file.sh

結果コマンドラインから3回実行すると、ターゲットファイルが表示されます。

$ cat /home/dan/timestamps
Sat Aug 17 18:31:12 CDT 2019
Sat Aug 17 18:31:33 CDT 2019
Sat Aug 17 18:31:34 CDT 2019

次に、3分間待って、cronで3回実行してから、ターゲットファイルを表示します(日付と同じ後に3つの新しい空白行があることを除いて、上記と同じです)。

考慮される問題..ファイルのアクセス許可。これに対処するために、権限と所有者:グループとともにリストされているファイルを次に示します。

-rwxrwxrwx 1 dan dan  157 Aug 17 18:43 timestamps*

..スクリプトがcronで実行されていません。解決済み:ファイルの変更時刻が毎分の最初に変更され、同時にファイルに新しい空白行が追加されるという事実により、スクリプトが実行されることが証明されています。

コマンドラインではなくcronでスクリプトを実行したときに、ファイルに日付が追加されない理由の説明は思いつきません。

任意のアイデアをいただければ幸いです。

ありがとうございました。

1
DanAllen

PATHは、特定のコマンドの名前ではなく、コマンドを検索するディレクトリのリストである必要があるため、インタラクティブなシェルで次のコマンドを実行して確認できるため、PATH=/bin/bash:は正しくありません。

$ PATH=/bin/bash: date
Command 'date' is available in '/bin/date'
The command could not be located because '/bin' is not included in the PATH environment variable.
date: command not found

cronはかなり限定された環境でジョブを実行しますが(printenv > /tmp/cronenvまたはcronジョブと同様に実行することで正確に確認できます)、デフォルトのPATHには/usr/bin/binの場所が含まれ、bash Shellとdate実行可能ファイルが見つかりました-まったく変更する必要はありません。使用するだけです。

* * * * *       /home/dan/append_date_to_file.sh

(もちろん、/home/dan/append_date_to_file.shが実行可能であることが条件です)。

余談ですが、コマンドの置換は必要ありませんecho $(date)-単純なdateでも同じ結果が得られます。

1
steeldriver

cronはむしろ$PATH時々気づかない。多くの人は単にコマンドのパスをコマンドの前に付けます。 dateコマンドの場合は、次の3つのコマンドのいずれかを使用してパスを見つけます。

$ which date
/bin/date

$ type -a date
date is /bin/date

$ command -v date
/bin/date

したがって、スクリプトを次のように変更します。

$(date)

に:

$(/bin/date)

以下を置き換えることにより、スクリプトを短縮できます。

target_file='/home/dan/timestamps'
echo $(/bin/date)  >>  $target_file

と:

/bin/date >> /home/dan/timestamps
1