我正在运行procmail recipe,当我收到一封特定的电子邮件时,它会触发我的一些应用程序。我已经完成了所有的工作,但是现在我需要在配方中构建一些条件,以免它一次又一次地运行,从而避免同一个程序的多个实例,因为我每10分钟就有一个procmail触发器。问题是我不太确定procmail中的if语句是如何生成的。
这是我到目前为止的食谱:
:0
* ^Subject: .*Email Subject!
| export DISPLAY=:0.0;
xrandr --size 1360x768;\
firefox "link"; \
timeout 10s recordmydesktop --fps 30; \
xrandr --size 1366x768
最佳答案
在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
,并在配方完成时将其删除。如果文件已经存在,Copmail将等待直到它消失,或者最终超时(这可能导致传入消息弹跳)。如果你需要一个跨越多个食谱的关键部分,你可以分配给“magical”变量
LOCKFILE
并在完成后将其设置为空值。LOCKFILE=firefox.lock
# ... Your recipes here ...
LOCKFILE=
(显然,本例最后一行的等号是可选的;但我建议不要使用这种用法。)
更多信息请参见
man 5 procmailrc
,包括LOCKSLEEP
和LOCKTIMEOUT
。“如何在Procmail中说‘if’”的简单答案是使用条件。您已经有了一个;只有消息头与正则表达式匹配时,才会触发该操作。您可以嵌套这些条件、测试变量、外部命令等。这里有一个愚蠢的虚构示例来演示它们。
# 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
}
如果设置了变量
^Subject:.*Email Subject!
,则输入块。Procmail使用您的环境变量,因此您可以在调用Procmail(取决于Procmail的选项;默认情况下,它将只继承您的环境的净化副本)或在其命令行以及配方文件中设置它。关于linux - 基于Procmail变量的条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26209769/