Ниже описан способ отображения в conky, dzen, xmobar и т.п. уведомления о
наличии свежей почты в maildir.
Преимущества данного способа:
1) он выдержан в стиле unix way,
2) не требует обращаться к жёсткому диску чаще, чем это необходимо.
Описание относится к Arch Linux, но процедура достаточно проста, чтобы легко
перенести её на любую систему с достаточно свежим ядром Linux.
Идея в том, что появление свежей почты отслеживается посредством incron; при
появлении нового сообщения вызывается скрипт mailstat.sh (см. ниже), который
считает новые сообщения в maildir, наблюдаемых incron-ом, формирует
текст-уведомление для пользователя и выдаёт это сообщение в именованный канал.
Со своей стороны, к примеру, conky читает из того же именованного канала и
отображает сообщение. Скрипт пишет в канал многократно, в бесконечном цикле,
чтобы сообщение не пропадало из conky; при запуске очередного экземпляра
скрипта он прибивает все предыдущие.
Итак, предположим, у нас Arch Linux с пользователем moses и его maildir-ами
/home/moses/Mail/work, /home/moses/Mail/club, куда периодически скачивается
почта с POP3-сервера. moses хочет узнавать о наличии свежей почты как можно
скорее, но не хочет поминутно лазить в почтовый клиент - он предпочёл бы видеть
уведомления на панели xmobar.
Вообще говоря, maildir-ов может быть больше, но moses хочет видеть уведомления только об этих.
Устанавливаем incron.
> sudo pacman -S incron
Разрешаем moses-у использовать incron.
> sudo vim /etc/incron.allow
moses
Создаём скрипт mailstat.sh.
vim ~/scripts/mailstat.sh
#!/bin/bash
TARGET=/tmp/mailstat
IT=mailstat
# определяем отслеживаемые maildir-ы
DIRS=`incrontab -l | grep $IT | awk '{print $1;}' | sort -u`
# подсчитываем свежие сообщения в maildir-ах
T=""
for d in $DIRS
do
c=`find $d -type f | wc -l`
if [[ $c -gt 0 ]]; then
T=$T`echo $d | sed -e 's/\/new$//' | sed -e 's/^.*\///'`": "$c" "
fi
done
# прибиваем ранее запущенные экземпляры скрипта
PIDS=`ps -eo pid,comm | grep $IT | grep -v $$ | awk '{print $1;}'`
for p in $PIDS
do
if [[ $p != $$ ]]; then
kill -9 $p 2>/dev/null
fi
done
# создаём именованный канал
if [ ! -e $TARGET ]; then
mkfifo $TARGET
fi
# пишем сообщение в канал
while true ; do
echo $T > $TARGET
done
Запускаем incron.
> sudo /etc/rc.d/incrond start
Настраиваем incron.
> incrontab -e
/home/moses/Mail/work/new IN_CREATE,IN_DELETE,IN_MOVED_FROM /home/moses/scripts/mailstat.sh
/home/moses/Mail/club/new IN_CREATE,IN_DELETE,IN_MOVED_FROM /home/moses/scripts/mailstat.sh
Убеждаемся, что изменения возымели действие.
> incrontab -l
Передёргиваем incron.
> incrontab -d
Настраиваем xmobar для отображения уведомлений.
> vim ~/.xmobarrc
Config { font = "-xos4-terminus-medium-r-normal--12-120-72-72-c-60-*-*"
, bgColor = "black"
, fgColor = "grey"
, position = Top
, lowerOnStart = True
, commands = [ Run Com "timeout" ["1 tail -n 1 /tmp/mailstat"] "mail" 5
, Run StdinReader
]
, sepChar = "%"
, alignSep = "}{"
, template = "%StdinReader%}{ <fc=#ee9a00>%mail%</fc>"
}
Настраиваем автозапуск incron.
> sudo vim /etc/rc.conf
DAEMONS=(@metalog network @crond @incrond)
|