atコマンドは突然/ランダムにジョブを実行します。

atコマンドは突然/ランダムにジョブを実行します。

このatコマンドには奇妙な動作があり、理由が見つかりません。

ストーリー -3日後、特定の時間に電子メールを送信して誰かを驚かせる必要があります。飛行機に20時間ほどある予定なので、すべてがきちんと帰っているかモニタリングはできないと思います。すべてが完全に実行されます。 :-)

スクリプト -at後で実行するためにジョブをキューに追加するには、このコマンドを使用しています。私は次の形式で複数のファイル(各メールごとに1つ)を作成しました。

mail1.txtの内容(例)

This is a subject
This is a message...
... on several lines

これは私のスクリプトです。

#!/bin/bash

function sendit {
        FROM_MAIL="[email protected]"
        RCPT_MAIL="[email protected]"

        SUBJECT=$(head -n  1 $1)
        MESSAGE=$(tail -n +2 $1)

        echo -e "$MESSAGE" |mail -s "$SUBJECT" -r $FROM_MAIL $RCPT_MAIL
}

# Note, time is EDT, it correspond to the date of my server
sendit mail1.txt|at 02:37 May 03
sendit mail2.txt|at 02:38 May 03
sendit mail3.txt|at 03:13 May 03
[...]

次にスクリプトを実行します。

$ bash script.sh
warning: commands will be executed using /bin/sh
job 35 at Tue May  3 02:37:00 2016
warning: commands will be executed using /bin/sh
job 36 at Tue May  3 02:38:00 2016
warning: commands will be executed using /bin/sh
job 37 at Tue May  3 03:13:00 2016
[...]

すべてが完璧に見えましたが、数分後にメールを確認してみると、メールの一部がすでに送信されていました...(ランダムに見えます)

どんなアイデアがありますか?

ベストアンサー1

|左プロセスの標準出力を右コマンドに送信します。あなたのsendit関数は実際にメールを送信しますが、stdoutは多くの出力を生成しないため(実際に出力が何であるかを覚えていません)、入力はメールを送信するmailコマンドatではありません。

ユーザーとして一般的に以下をat使用することを検討してください。

at 02:37 May 03        # This will read commands from stdin until Ctrl/D
sendit mail1.txt
Ctrl/D

senditプログラムで次のコマンドをパイプすることもできますat

echo 'sendit mail1.txt' | at 02:37 May 03

おすすめ記事