Нужен сценарий оболочки, который должен отправить почту мне один раз в 20 дней

Можно использовать echo -e:

echo -e "\x66\x6f\x6f"

Действительно отметьте это hexdump -C то, что Вы хотите вывести содержание файла в порядке байтов вместо того, чтобы быть интерпретированными как 4-байтовые слова в сетевом порядке байтов.

-3
29.10.2013, 13:56
2 ответа

Если это - просто почта с текстом, никакими вложениями:

/some/path/script.sh

Содержание:

#send me an email:
cat text | mail -s "subject" your@email.com

Чтобы иметь его каждые 20 дней, путь мог состоять в том, чтобы измениться на сценарий для добавления:

#send me an email:
cat text | mail -s "subject" your@email.com
#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

Иначе мог быть должен использовать crontabs (crontab -e как пользователь Вы хотите, чтобы сценарий был выполнен с). Для запущения скрипта каждые 20 дней через crontab я позволяю Вам man crontab ^^

Если Вы нуждаетесь во вложениях в той почте, лучше устанавливаете "дурака" (или подобные программы, простые в использовании в командной строке и способные обработать вложения).

===

другой подход теперь, когда Вы precised Вы хотите использовать ежедневный крон: Вы запускаете скрипт каждый день и хотите, чтобы он сделал что-то специальное (т.е., для отправки электронного письма), если это были 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" your@email.com
    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

...
3
28.01.2020, 05:18
  • 1
    скрипт, который я могу запланировать тот сценарий в кроне, чтобы запускать каждый день и видеть, отправит ли его 20-й день, это почту мне.. Надежда Вы понимаете мой вопрос теперь.. –  Tarun Battula 29.10.2013, 14:21
  • 2
    @user50177: Я обновил свой ответ: посмотрите "другой подход" –  Olivier Dulac 29.10.2013, 14:35

Если компьютер, Вы работаете на этом, никогда не выключается, Вы могли бы просто запустить немного сценария как это:

while :; do sleep 20d; echo "hello Bob" | mail -s "subject" your@email.com; done

Сценарий выше будет работать навсегда (while :;), это будет ожидать в течение 20 дней (сон 20d), затем отправить Вас, почта затем ожидает в течение еще 20 дней, отправляет Вам почту снова и т.д.

Другой подход, который ужасен, но должен работать, должен генерировать строки крона, вручную затем добавляют их к Вашему 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 you@email.com"
done

Запущение скрипта выше продуктов следующий вывод:

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

Добавление тех строк к Вашему crontab заставит электронное письмо отправляться Вам каждые 20 дней в течение следующего года. Необходимо будет выполнить его снова в следующем году.

2
28.01.2020, 05:18
  • 1
    я думаю, что это собирается работать каждый дни с 30 выходами на 20-м. Или возможно 1-е и 20-е. Но я вполне уверен, это не будет каждые 20 дней. –  derobert 29.10.2013, 17:08
  • 2
    @derobert я знаю */5 в первом поле будет работать каждые 5 минут, почему дневное поле отличалось бы? Кроме того, если я не неправильно понимаю страницу справочника, которая является точно, что она говорит, что сделает: "каждые два часа", просто используют "*/2". –  terdon♦ 29.10.2013, 17:11
  • 3
    , который я не протестировал, но */5, означает 0,5,10... Это удается, так как 60 является кратным 5. Точно так же */20 означал бы 0,20,40 в минуты или поле секунд, где это будет работать (60 быть кратных 20), но это должно означать то же самое в поле дня месяца, но это не будет работать там, поскольку 28, 29, 30, и 31 не кратные числа 20. –  derobert 29.10.2013, 17:16
  • 4
    @derobert черт возьми, Вы абсолютно правы, спасибо. Ответ изменяется. –  terdon♦ 29.10.2013, 17:36
  • 5
    Ха, я думаю, что необходимо все еще упомянуть крон — можно (главным образом) делать каждые 20 дней, с большим количеством записей, обстоятельно объясняя 1 января, 21 января, 10 февраля, 2 синяка (1-й на високосном годе), и т.д. Или путем выполнения ежедневно и с помощью date +%j (ни один не прекрасен, поскольку 365/366 не являются кратными числами 20). Или трюки с find -mtime +20. –  derobert 29.10.2013, 17:40

Теги

Похожие вопросы