LINUX.ORG.RU

Не могу написать простой скрипт

 ,


0

1

В общем сабж:Берем fetchmail. Check-аем его(fetchmail -c).
Если почта есть он выдает строку:«N сообщений для ...»,если ее нету, то «Для ... почты нет».
Собственно захотелось написать скрипт, который засовываем в crontab, и он каждые 5 минут notify-send'ом шлет уведомление о том, что есть новая почта.
Собственно скрипт следующий:

#!/bin/bash
export DISPLAY=:0.0
if fetchmail -c | grep 'сообщ'; then
MAILCOUNT=`fetchmail -c | awk '{print $1}'`; else
MAILCOUNT='0'; fi

if [ ! $MAILCOUNT -eq 0 ]; then
notify-send -t 10000 -i $HOME/.icons/email.png "Новая почта" "Новых сообщений: $MAILCOUNT"; fi
Сделал скрипт исполняемым в crontab -e и засунул его исполняться каждую минуту(* * * * * sh /home/jtj/.script).
Исполняется, судя по выхлопу #systemctl status cronie.service
cronie.service - Periodic Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/cronie.service; enabled)
 Active: active (running) since Thu, 2012-11-08 09:54:06 NOVT; 28min ago
Main PID: 329 (crond)
  CGroup: name=systemd:/system/cronie.service
	   329 n/a
	   663 n/a
Nov 08 10:18:01 sleam /usr/sbin/crond[21404]: pam_unix(crond:session): session opened for user jtj by (uid=0)
Nov 08 10:18:01 sleam /USR/SBIN/CROND[21405]: (jtj) CMD (/home/jtj/.fetch )
Но notify-send не рождает уведомления на экране.
Что в скрипте неверно?



Последнее исправление: destructiond (всего исправлений: 1)

А ну еще, обертка работает нормально: если вызываем ее исполнение с терминала, все нормально.

destructiond
() автор топика

Условие странное у тебя.

-if fetchmail -c | grep 'сообщ'; then
+if [[ $(fetchmail | grep 'сообщ' | wc -l) -gt 0 ]]; then 
 

Так сработает?

lllnk
()
Ответ на: комментарий от destructiond

Что то я не уверен, что cron выставляет $HOME

И вобще, непонятно зачем это пихать в cron, напишие на баше бесконечный цикл, воткните туда «sleep 60» и запускайте это в фоне при логине пользователя в X-ы, чтобы не было проблем с $DISPLAY, $XAUTHORITY.

mky ★★★★★
()
Ответ на: комментарий от lllnk

Нормальное там условие, разве что может быть не установлена локаль и fetchmail может «говорить» по англйски, но сам синтаксис if записан верно.

Прочитайте man grep, man bash и больше не пишите такой код.

mky ★★★★★
()
Ответ на: комментарий от Pinkbyte

с DISPLAY все впорядке,однострочник типа:

#!/bin/bash
export DISPLAY=:0.0
notify-send ...
работает.

destructiond
() автор топика
Ответ на: комментарий от justAmoment

а какая разница?
Можно же указать при редактировании crontab'а для определенного пользователя переменную PATH, и будет тоже самое.

destructiond
() автор топика
Ответ на: комментарий от mky

Насчет $HOME, а оно cron'у то зачем?:) Используется же сугубо в bash-скрипте, который вообще без проблем оперирует этой переменной.

А что касается sleep'а..Немного костыльно, но спасибо за работающее решение :)

destructiond
() автор топика
Ответ на: комментарий от destructiond

Насчет $HOME, а оно cron'у то зачем?:)

Вот именно, что незачем. И я точно не помню, все ли версии cron'а устанавливают HOME по содержимому /etc/passwd, а LOGNAME выставляют по владельцу crontab файла. Так что для полноты картины можно засунуть в вызываемый из cron'а скрпт команды вывода переменных в файл. Что то типа:

{ /bin/date ; echo $PATH; echo $HOME; } >> /tmp/AA

Решение с зацикленным bash скриптом, на мой взгляд, более правильное, так как оно может запускается только при логине пользователя и автоматически получает нужный $DISPLAY и другие переменные. А cron, ИМХО, только для задач, которые должны выполнятся всегда по расписанию, независимо от того, есть ли открытые сессии пользователей у системы.

mky ★★★★★
()
Ответ на: комментарий от mky

Абсолютное Ъ — ~/.config/cron.avail, набор ~/.config/cron.<whatever> и симлинк туда при логине + очистка симлинка при логауте. Естественно, в юзерском кронтабе всё это описано. Делал так когда совсем нечего было делать.

Алсо, зачем 2 раза fetcmail вызывать, если можно 1? Хотя сейчас интернеты широкие.

x3al ★★★★★
()
Ответ на: комментарий от x3al

А как скрипт, запускаемый через cron должен определять $DISPLAY? Кроме создания симлинка ещё в какой-то файл при логине нужно скидывать эту информацию?

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

Продолжаем делать проблемы на ровном месте

Хороший вопрос. У меня был мини-демон для нотификаций, а кроноскрипты просто кормили его данными через пайпы, поэтому такой проблемы не было. Да, скидывание информации в файл (~/.local/sessions/current-x-session например) выглядит решением. Или через dbus у чего-нибудь спрашивать, но в общем случае dbus не существует (или?).

x3al ★★★★★
()
Ответ на: комментарий от mky

Файлы тоже. Но кому до этого есть дело? X-форвардинг отдельных программ — одно, целой сессии — совершенно другое.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.