Как использовать Mutt, чтобы отправить мне уведомление о завершении программы

Я использую Linux. Я хочу, чтобы компьютер отправил мне письмо, когда программа будет завершена с помощью mutt (школа не позволяет нам использовать mail). Я старался mutt и работает нормально.

Я использую следующий скрипт для запуска программы

cd /home/program/K_10 && nohup Rscript program_1.R> program_1_out.txt;

Как я могу сделать это, чтобы отправить мне письмо, когда программа будет завершена. Письмо должно иметь The job /home/program/K_10/program_1.R is finished, Кроме того, если это возможно, вы можете помочь мне прикрепить /home/program/K_10/program_1.txt, который является результатом program_1.R? Я совсем новичок в Linux.

1 ответ

Решение

Все, что вам нужно, это что-то вроде этого:

cd /home/program/K_10 && nohup Rscript program_1.R> program_1_out.txt;
echo "The job /home/program/K_10/program_1.R is finished" |mutt "your@email" -s "Your job"

то есть в скрипте сначала выполняйте задание, а затем (по очереди) отправляйте почту себе. echo командные трубы в mutt который использует его в качестве содержимого почты. -s Опция устанавливает тему письма.

Более хороший способ сделать это - поместить суть команд в скрипт, что-то вроде этого:

#!/bin/sh
cd $(dirname $1) && nohup Rscript $(basename $1) > $(basename $1 .R)_out.txt;
echo "The job $1 is finished" |mutt "your@email" -s "Your job"

и (вызывая этот файл run-job), вызвать его

run-job /home/program/K_10/program_1.R

Сломав это немного:

  • run-job назван так, чтобы подсказывать функции скрипта. Имена сценариев не имеют установленного соглашения (это зависит от разработчика). Некоторые используют ".sh" суффикс на именах, чтобы сделать их тип более очевидным, но это не обязательно.
  • ".R" суффикс является еще одним соглашением об именах, но может понадобиться Rscript, В любом случае, это часть существующего имени файла.
  • $1 это параметр (или аргумент), данный сценарию. Более полный сценарий может проверить (а), присутствует ли параметр, и (б), соответствует ли параметр существующему файлу, но эти шаги опущены, чтобы упростить его.
  • $(dirname $1) возвращается /home/program/K_10, а также
  • $(basename $1 .R) принимает это /home/program/K_10/program_1.R и возвращается program_1,
  • Для этого простого сценария можно взять части пути и использовать их для создания более общего сценария, чем просто буквальные команды.

nohup здесь неловко; Я бы переместил это из сценария. Тогда вы можете напрямую контролировать способ запуска скрипта, например:

nohup run-job /home/program/K_10/program_1.R &

При создании сценария, такого как run-job, вы должны помнить, чтобы сделать это:

  • сделать его исполняемым, например, chmod u+x run-job
  • либо положить сценарий в каталог на вашем $PATH (такие как $HOME/bin во многих системах), или позаботьтесь о том, чтобы вызвать его, используя его путь. Например, если он находится в текущем каталоге, вы можете просто сделать

    nohup ./run-job /home/program/K_10/program_1.R &

  • Для локализации проблем (либо моя опечатка, либо по какой-либо другой причине) оболочка предоставляет функцию трассировки (фактические команды будут напечатаны по мере их выполнения). Чтобы включить трассировку, измените первую строку скрипта на

    #!/bin/sh -x

Другие вопросы по тегам