20일마다 이메일을 보내는 쉘 스크립트가 필요합니다.

20일마다 이메일을 보내는 쉘 스크립트가 필요합니다.

누군가 나에게 20일마다 메일을 보내는 쉘 스크립트를 작성하는 논리나 전체 스크립트를 말해 줄 수 있습니까?

답변1

텍스트만 있고 첨부 파일이 없는 이메일인 경우:

/some/path/script.sh

콘텐츠:

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

20일마다 가져오려면 다음을 추가하도록 스크립트를 변경하는 것이 한 가지 방법일 수 있습니다.

#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을 사용하고 싶다고 명시적으로 밝혔습니다. 또 다른 접근 방식: 매일 스크립트를 실행하고 20일 후에 특별한 작업(예: 이메일 보내기)을 수행하기를 원하십니까?

한 가지 방법은 이 부분을 스크립트에 넣는 것입니다.

#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일을 기다린 후 다시 메일을 보내는 식으로 계속됩니다.

추악하지만 작동해야 하는 또 다른 접근 방식은 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일마다 이메일이 전송됩니다. 내년에 다시 실행해야 합니다.

관련 정보