【问题标题】:Where to place a shell script?在哪里放置 shell 脚本?
【发布时间】:2011-04-08 18:29:24
【问题描述】:

你好电脑同胞:)

我有一个 shell 脚本,我将用作看门狗计时器。它检查我的其他“主”程序是否正在运行。如果不是,它会重新启动它。

问题是:如何在 Mac 上安装它?是否存在操作系统将自动定期调用脚本的文件夹/plist 文件场景,以确保我的程序在不运行的情况下永远不会运行那么长时间?理想情况下,我希望每分钟测试一次,但每小时甚至每天几次都令人满意。

谢谢!

【问题讨论】:

    标签: macos shell cron crontab


    【解决方案1】:

    我不是 Mac 用户,但应该有 cron 守护进程。 http://hints.macworld.com/article.php?story=2001020700163714

    【讨论】:

      【解决方案2】:

      Crontab 应该对你有好处。将您的脚本设置为每 X 分钟运行一次,其余的将由 cron 完成。如果您更喜欢 GUI 界面而不是程序,请尝试 cronnix

      【讨论】:

      • crontab 不是 Mac OS X 的“方式”。有关官方答案,请参阅 gavinb 的答案。
      • @JeremyP 我接受您的评论,但如果您愿意,希望得到澄清。不是 Max OSX“方式”,您的意思是 Launch Services 包含 Cron,并且比使用 Cron 安排任务有明确的好处(超过用户友好性,即系统好处)?或者您只是说鼓励使用 Launch Services over Cron?
      • 启动服务可以做 cron 可以做的所有事情,甚至更多。其目的是为需要在没有用户干预的情况下启动的所有内容提供统一的框架。它取代了 inittab、rc.d、inetd、cron、at 和标准 Unix 守护进程,并且可能还有许多其他用于启动多年来积累的后台任务的东西。它并不比 cron 更容易配置,但 Apple 声称它工作得更好。
      • 它确实工作得更好。它提供了用于指定作业类型的声明性语法。它允许控制反转,让操作系统在调用它们时负责生成进程,而不是每个单独的脚本。使用 cron,您可以说“每 X 分钟执行一次此过程”。使用启动代理,您可以说每当挂载卷或用户登录时声明要执行的进程,或者“此进程应始终运行”。然后,Mac OS 提供了一个统一的框架来管理这些服务并处理细节问题。
      【解决方案3】:

      在 Mac OS X 上执行此操作的方法是使用启动服务。它取代了旧的系统服务,例如initcrontab,并为管理系统服务提供了一个单一、统一的框架。

      在您的情况下,您可能不需要单独的脚本 - 保持应用实例运行应该由系统处理。首先,您需要创建描述您的守护进程/脚本/应用程序的.plist 文件。您可以将其放置在以下位置之一,具体取决于服务类型:

      • ~/Library/LaunchAgents:用户提供的每用户代理。
      • /Library/LaunchAgents:管理员提供的每用户代理。
      • /Library/LaunchDaemons:管理员提供的系统范围的守护进程。
      • /System/Library/LaunchAgents:Mac OS X 每用户代理。
      • /System/Library/LaunchDaemons:Mac OS X 系统范围的守护进程。

      一旦定义了服务,就可以使用launchctl 命令来控制launchd。例如,您可以列出正在运行的服务、启动/停止服务等。

      完整的文档在这里:

      【讨论】: