2014-10-06 3 views
0

Я запускаю procmail рецепт, который запускает некоторые из моих приложений в тот момент, когда я получаю определенное электронное письмо. У меня все работает, но теперь мне нужно создать условия в рецепте, чтобы не заставлять его запускать снова и снова, чтобы избежать нескольких экземпляров одной и той же программы, поскольку у меня есть триггер procmail каждые 10 минут. Проблема в том, что я не совсем уверен, как в procmail выполняются предложения «если».Procmail переменная основана на условии

Вот рецепт, который я до сих пор:

:0 
* ^Subject: .*Email Subject! 
| export DISPLAY=:0.0; 
    xrandr --size 1360x768;\ 
    firefox "link"; \ 
    timeout 10s recordmydesktop --fps 30; \ 
    xrandr --size 1366x768 

ответ

1

Простой и идиоматических способ иметь в Procmail critical section является использование файла блокировки.

# Notice the second colon and the name of the lock file to use 
:0:firefox.lock 
* ^Subject: .*Email Subject! 
| export DISPLAY=:0.0; 
    xrandr --size 1360x768;\ 
    firefox "link"; \ 
    timeout 10s recordmydesktop --fps 30; \ 
    xrandr --size 1366x768 

Это создаст $MAILDIR/firefox.lock когда рецепт вычисляется, и удалить его, когда рецепт заканчивается. Если файл уже существует, Procmail будет ждать, пока он не исчезнет, ​​или в конечном итоге истечет время ожидания (что может привести к отказу входящего сообщения).

Если вам нужен критический раздел, охватывающий несколько рецептов, вы можете назначить «магическую» переменную LOCKFILE и установить ее по пустым значению, когда вы закончите.

LOCKFILE=firefox.lock 

# ... Your recipes here ... 

LOCKFILE= 

(Неясно, знак равенства в последней строке этого примера является необязательным. Но я рекомендую против этого использования)

См man 5 procmailrc для (много) больше, включая LOCKSLEEP и LOCKTIMEOUT.

Тривиальный ответ на вопрос «как сказать« если »в Procmail - использовать условие. У вас уже есть; действие будет вызывать только , если заголовки сообщения соответствуют регулярному выражению ^Subject:.*Email Subject!. Вы можете вложить эти условия, проверить переменные, внешние команды и т. Д. Вот глупый придуманный пример, чтобы продемонстрировать их все.

# If $FOO is set and non-empty 
:0 
* FOO ?? . 
{ 
    # ... then enter this nested block 
    # Does $HOME/bar exist? 
    :0 
    * ? test -e $HOME/bar 
    barista 

    # Otherwise, unconditionally deliver to foolish 
    :0 
    foolish 
} 

Блок вводится, если установлена ​​переменная FOO. Procmail использует переменные окружения, поэтому вы можете установить его перед вызовом Procmail (в зависимости от параметров Procmail, он по умолчанию будет наследовать санированную копию вашей среды) или в командной строке, а также в вашем файле рецепта.

Смежные вопросы