21.6. 过期新闻

在 B News 中,过期处理需要通过一个名为 expire 的程序来完成,它接受新闻组列表作为参数,以及文章必须过期的指定时间。 为了使不同的层级在不同的时间过期,您必须编写一个脚本,分别针对每个层级调用 expire。 C News 提供了一个更方便的解决方案。 在一个名为explist的文件中,您可以指定新闻组和过期时间间隔。 通常每天通过 cron 运行一个名为 doexpire 的命令,并根据此列表处理所有组。

有时,您可能希望保留某些组中的文章,即使它们已经过期;例如,您可能希望保留发布到 comp.sources.unix 的程序。 这被称为归档explist允许您标记要归档的组。

中的条目explist看起来像这样
grouplist perm times archive

grouplist是一个以逗号分隔的新闻组列表,该条目适用于这些新闻组。可以通过给出组名称前缀来指定层级,可以选择附加 all。 例如,对于应用于 comp.os 下所有组的条目,输入comp.oscomp.os.all.

当从某个组过期新闻时,会按照给定的顺序检查名称是否与explist中的所有条目匹配。 第一个匹配的条目适用。 例如,要丢弃 comp 中的大部分内容(四天后),除了 comp.os.linux.announce(您想要保留一周),您只需为后者创建一个条目,指定七天的过期时间,然后在 comp 的过期期间指定四天。

perm字段详细说明了该条目是否适用于审核组、非审核组或任何组。 它可以采用 mux 值,分别表示审核、非审核或任何类型。

第三个字段,times,通常只包含一个数字。 这是文章在 article header 中的 Expires 字段中未被分配人工过期日期后过期的天数。 请注意,这是从文章到达您的站点的天数开始计算的,而不是发布日期。Expires字段中未被分配人工过期日期后过期的天数。 请注意,这是从文章到达您的站点的天数开始计算的,而不是发布日期。

times字段可能比这更复杂。 它可以是最多三个数字的组合,这些数字之间用破折号分隔。 第一个表示文章被认为是过期候选者的天数,即使 expires 字段已经过期。 使用除零以外的值很少有用。 第二个字段是前面提到的默认天数,文章将在该天数后过期。 第三个是文章将无条件过期的天数,无论它是否具有 Expires 字段。 如果仅给出中间数字,则其他两个采用默认值。 这些可以使用特殊条目 /bounds/ 来指定,稍后将对此进行描述。Expiresfield would have it expire already. It is rarely useful to use a value other than zero. The second field is the previously mentioned default number of days after which it will be expired. The third is the number of days after which an article will be expired unconditionally, regardless of whether it has anExpiresfield or not. If only the middle number is given, the other two take default values. These may be specified using the special entry /bounds/, which is described a little later.

第四个字段,archive,表示新闻组是否要归档以及归档到哪里。 如果不打算进行归档,则应使用破折号。 否则,您可以使用完整路径名(指向目录)或 at 符号 (@)。 at 符号表示默认的存档目录,必须通过在命令行上使用–a标志将其提供给 doexpire。 存档目录应归 news 所有。 当 doexpire 归档 comp.sources.unix 中的文章时,它会将其存储在存档目录下的 comp/sources/unix 目录中,并在必要时创建该目录。 但是,不会创建存档目录本身。

在您的explist文件中,doexpire 依赖于两个特殊条目。 它们不包含新闻组列表,而是包含关键字 /bounds//expired//bounds/ 条目包含前面描述的 times 字段的三个值的默认值。timesfield described previously.

/expired/ 字段确定 C News 将在history文件中保留多长时间。 C News 不会在相应的文章过期后从历史记录文件中删除一行,而是会保留它,以防在此日期之后到达重复项。 如果您仅由一个站点提供,则可以使此值保持较小。 否则,建议在 UUCP 网络上保留几个星期,具体取决于您从这些站点收到的文章的延迟。

这是一个示例explist文件,其有效期间隔相当短
# keep history lines for two weeks. No article gets more than three months
/expired/                       x       14      -
/bounds/                        x       0-1-90  -
# groups we want to keep longer than the rest
comp.os.linux.announce          m       10      -
comp.os.linux                   x       5       -
alt.folklore.computers          u       10      -
rec.humor.oracle                m       10      -
soc.feminism                    m       10      -
# Archive *.sources groups
comp.sources,alt.sources        x       5       @
# defaults for tech groups
comp,sci                        x       7       -
# enough for a long weekend
misc,talk                       x       4       -
# throw away junk quickly
junk                            x       1       -
# control messages are of scant interest, too
control                         x       1       -
# catch-all entry for the rest of it
all                             x       2       -

过期会带来几个潜在的问题。 一个是您的新闻阅读器可能依赖于前面描述的 active 文件的第三个字段,该字段包含在线的最低文章编号。 过期文章时,C News 不会更新此字段。 如果您需要(或想要)此字段代表真实情况,则需要在每次运行 doexpire 后运行一个名为 updatemin 的程序。 (在旧版本的 C News 中,一个名为 upact 的脚本完成了这项工作。)

C News 不会通过扫描新闻组的目录来过期,而只是检查history文件,以确定文章是否已到期。[1] 如果您的历史记录文件不知何故失去同步,则文章可能会永远存在于您的磁盘上,因为 C News 实际上已经忘记了它们。[2] 您可以使用/usr/lib/news/maint中的 addmissing 脚本来修复此问题,该脚本会将缺少的文章添加到history文件中,或者使用 mkhistory 从头开始重建整个文件。 请不要忘记在调用它之前成为用户 news,否则您最终会得到 C News 无法读取的history文件。

注释

[1]

文章的到达日期保存在历史记录行的中间字段中,并以自 1970 年 1 月 1 日以来的秒数表示。

[2]

我不知道为什么会发生这种情况,但它确实会不时发生。