20日ごとに電子メールを送信するシェルスクリプトが必要です。

20日ごとに電子メールを送信するシェルスクリプトが必要です。

誰かが私に20日ごとにメールを送信するシェルスクリプトを書くロジックまたはスクリプト全体を教えてもらえますか?

答え1

テキストのみで添付ファイルがないメールの場合:

/some/path/script.sh

コンテンツ:

#send me an email:
cat text | mail -s "subject" [email protected]

20日ごとにインポートするには、スクリプトを次のように追加するように変更することが1つの方法です。

#send me an email:
cat text | mail -s "subject" [email protected]
#and the script itself re-schedule itself to start again in 20 days:
echo "$0" | at now + 20 days #And remember to launch that script using its full path

別の方法はcrontabを使用することです(crontab -eスクリプトを実行したいユーザーとして)。 crontabで20日ごとにスクリプトを実行しますman crontab^^

その電子メールの添付ファイルが必要な場合は、「mutt」(またはコマンドラインで使いやすく、添付ファイルを処理できるような同様のプログラム)をインストールすることをお勧めします。

===

今、私は毎日cronを使用したいと明示的に述べています。もう1つのアプローチ:毎日スクリプトを実行し、20日後に特別なタスク(電子メールを送信するなど)を実行したいですか?

1つの方法は、この部分をスクリプトに入れることです。

#the script

#near the beginning:
[ ! -e /some/flagfile ] && touch /some/flagfile #create /some/flagfile, ONCE.

...  #the usual script treatment, if any

#and the test: if our flagfile is >=20 days old, we mail a msg and delete the flag
sleep 10  #IMPORTANT: that way we are sure the flag done 20 days ago is at least
          #           20days+a few seconds, and thus the following test will work !
if ( find /some -mtime +20 -print | grep '/some/flagfile$' >/dev/null )
then
     # we found a /some/flagfile of at least 20 days!
    cat /some/message | mail -s "subject" [email protected]
    rm /some/flagfile  #you could add checks that the email worked...
     # so next time you run the script, it will create the new /some/flagfile.
     # But if you prefer to have the 20 days start "now" instead of when the script
     # is run next, you could uncomment the next line instead:
    #touch /some/flagfile
fi

...

答え2

このプログラムを実行しているコンピューターがシャットダウンしない場合は、次の小さなスクリプトを起動できます。

while :; do sleep 20d; echo "hello Bob" | mail -s "subject" [email protected]; done

上記のスクリプトは永久に実行され(while :;)、20日間待ってから(20日間休止)、メールを送信し、20日間待ってから再びメールを送信するように続けられます。

醜いが動作する必要があるもう1つのアプローチは、cronラインを手動で作成してからcrontabに追加することです。

DATE=$(date -d "$(date -d @"$(($(date +%s) + 1728000))")")
for i in {1..16}; do 
 DATE=$(date -d "$(date -d @"$(( $(date -d "$DATE" +%s) + 1728000))")" +"%e %b");
 echo "0 0 $DATE echo \"hello bob\" | mail [email protected]"
done

上記のスクリプトを実行すると、次の出力が生成されます。

0 0  8 Dec echo "hello bob" | mail [email protected]
0 0 28 Dec echo "hello bob" | mail [email protected]
0 0 17 Jan echo "hello bob" | mail [email protected]
0 0  6 Feb echo "hello bob" | mail [email protected]
0 0 26 Feb echo "hello bob" | mail [email protected]
0 0 18 Mar echo "hello bob" | mail [email protected]
0 0  7 Apr echo "hello bob" | mail [email protected]
0 0 27 Apr echo "hello bob" | mail [email protected]
0 0 17 May echo "hello bob" | mail [email protected]
0 0  6 Jun echo "hello bob" | mail [email protected]
0 0 26 Jun echo "hello bob" | mail [email protected]
0 0 16 Jul echo "hello bob" | mail [email protected]
0 0  5 Aug echo "hello bob" | mail [email protected]
0 0 25 Aug echo "hello bob" | mail [email protected]
0 0 14 Sep echo "hello bob" | mail [email protected]
0 0  4 Oct echo "hello bob" | mail [email protected]

crontabにこの行を追加すると、翌年には20日ごとに電子メールが送信されます。来年再度実行する必要があります。

関連情報