【问题标题】:Running emacs from the command line and handling locked files从命令行运行 emacs 并处理锁定的文件
【发布时间】:2011-08-09 06:15:20
【问题描述】:

我正在使用 org-mode 并希望将我的议程 (example of an agenda) 导出到一个文本文件,以便我可以用 conky 显示它。 org-mode manual 提供了这个命令行示例来执行此操作:

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

我已经这样修改了:

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

我将此设置为每 5 分钟运行一次的 cron 作业。除非我真的打开了 emacs,否则它工作得很好。然后我注意到文件agenda-export.txt 是空的。在从 coammand 行与通过 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

【问题讨论】:

  • 关于使用wc -l 测试空文件的无用的切线评论。 man test(特别是test -s)或者grep,如果你想查找非空行之类的。
  • @tripleee:谢谢。无论如何,我都不是 bash 专家。感谢您的提示!

标签: emacs command-line org-mode


【解决方案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 个文件被从中提取,而不仅仅是一个。这在我的问题中可能令人困惑——我举了一个关于锁投诉的例子。如果我有几个打开的,我会得到一个错误。
  • 1) 并非如此。您引用的“组织模式”手册中的第三个示例显示了如何更改文件位置。您可以在 main .emacs 中定义函数并从命令行调用它以缩短命令行。 2) 没问题,'mkdir -p /tmp/dest && cp dir/*.org /tmp/dest/' 会愉快地复制多个文件。如果您的文件很大(300K+),您可以使用 rsync,但我认为这将是矫枉过正。
  • 我只是忍受了一段时间,因为如果 emacs 是打开的,cron 作业不会运行。由于缺乏更新来重新审视这一点,我感到非常沮丧,而您的解决方案绝对有效!我调整了我的简单 bash 脚本以检查 /tmp/org;如果它不存在,则创建它。然后 cp ~/org/*.org /tmp/org/。然后运行上面的命令,但使用(正如你所指出的!)org-agenda-files (quote ("/tmp/org")) 选项。效果很好。
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2016-11-07
  • 2011-05-22
相关资源
最近更新 更多