Простой и идиоматических способ иметь в 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, он по умолчанию будет наследовать санированную копию вашей среды) или в командной строке, а также в вашем файле рецепта.