从命令行运行emacs并处理锁定文件

3

我正在使用org-mode,并希望将我的日程表(日程表示例)导出到文本文件中,以便我可以在conky中显示它。 org-mode手册提供了以下命令行示例来实现此目的:

emacs -batch -l ~/.emacs -eval '(org-batch-agenda "t")' | lpr

我已经进行了如下修改:

我已经进行了如下修改:

emacs -batch -l ~/.emacs -eval '(org-batch-agenda "e")' \
> ~/org/aux/agenda-export.txt

我将此设置为cron作业,每5分钟运行一次。它很好用,除非我实际上打开了emacs。然后我注意到文件agenda-export.txt是空的。在从命令行手动运行此操作与通过cron运行时,我会收到此错误(或类似错误,具体取决于我打开的文件):

...~/org/file.org locked by jwhendy (pid 10935): (s, q, p, ?)?

我打算编写一个脚本,可能导出到agenda-export-test.txt,然后检查空文件或没有行(wc -l == 0可能?)。如果是真的,保留现有文件并删除agenda-export-test.txt。如果不是,则将agenda-export-test.txt移动到agenda-export.txt
但是...当我尝试运行这样的脚本时,我遇到了同样的emacs询问是否窃取锁定、继续或退出。我可以继续,因为我认为org-agenda对文件没有任何影响,因此它不会损坏任何东西...但我不知道如何告诉emacs在遇到问题时“强制”或选择“继续”。我需要一些非交互式的东西。
因此,总结一下,我的想法是尝试:
  • 传递一个--force选项或类似的选项给emacs,使其在暂停时继续
  • 查看导出的tmp文件是否有任何行,并相应地处理它
  • 告诉emacs以“只读模式”运行(但我不认为它存在)
主要问题是,使用cron时,我无法告诉进程该做什么,因此它只会生成一个空文件作为导出结果。如何处理像cron这样的“盲目”进程无法响应的锁定文件业务?
我也尝试在邮件列表上询问,但没有得到有效的结果。[1]我想知道这里是否有人有想法。
[1]http://www.mail-archive.com/emacs-orgmode@gnu.org/msg45056.html

1
关于使用 wc -l 来测试空文件的无用性的旁注。如果要查找非空行或其他内容,可以参考 man test(具体来说是 test -s)或者 grep - tripleee
@tripleee:谢谢。我绝不是Bash专家。感谢你的提示! - Hendy
1个回答

1

你试过不使用emacs来复制文件吗? 放入你的crontab中:

cp ~/org/file.org /tmp/export.org && emacs -batch .... /tmp/export.org ..

一个普通的“cp”命令不应该复制emacs锁。当然,如果你在cp命令期间保存日程表,偶尔可能会得到一个损坏的文件,但这应该不会太糟糕。

有趣的建议。我有几个问题:1)org-mode从.emacs获取其议程候选列表;因此,我认为我需要一个单独的.emacs文件告诉它查找/tmp/dir/而不是~/org。2)在这方面,我每次都需要复制一个目录,因为我有大约10个文件被拉出来,而不仅仅是一个。这可能在我的问题中有些混淆——我只是举了一个锁定投诉的例子。如果我打开了几个,我会收到每个错误。 - Hendy
  1. 不完全是。你所提到的“org-mode”手册中的第三个例子展示了如何更改文件位置。你可以在主要的.emacs文件中定义函数,并从命令行调用它,以使命令行更短。
  2. 没问题,“mkdir -p /tmp/dest && cp dir/*.org /tmp/dest/”可以愉快地复制多个文件。如果你的文件很大(300K+),你可以使用rsync,但我认为这会过度杀伤。
- theamk
我曾经通过让 cron 作业在 Emacs 打开时不运行来暂时解决了这个问题。由于缺乏更新而感到沮丧,我重新审视了这个问题,你的解决方案绝对有效!我调整了我的简单 bash 脚本以检查 /tmp/org;如果不存在,则创建它。然后 cp ~/org/*.org /tmp/org/。然后运行上面的命令,但使用(正如你指出的!)org-agenda-files (quote ("/tmp/org")) 选项。效果非常好。 - Hendy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接