【问题标题】:Schedule cron job to open Terminal and run command sequentially安排 cron 作业以打开终端并按顺序运行命令
【发布时间】:2016-12-13 03:04:44
【问题描述】:

我在 Mac 上安排了一个 cron 作业,每天晚上 11 点打开终端,如下所示:

0 23 * * * open -a Terminal

效果很好!但我想要的不仅是打开终端,还要在其中运行一个简单的命令。从网上看,it looks as if cron commands can be chained with &&

0 23 * * * open -a Terminal && echo 'Hello, world!'

但是,这个修改后的 cron 作业只会打开终端,而不会在那里运行第二个命令。 关于如何让 cron 工作同时完成这两个方面的任何想法?

【问题讨论】:

    标签: linux macos terminal cron scheduled-tasks


    【解决方案1】:

    pahSameer Naik 已经提供了很好的答案,但我最终使用 AppleScripts 提出了一个更简单的解决方案,灵感来自an SO answer to a similar question

    0 23 * * * osascript -e 'tell application "Terminal" to do script "echo \"Hello, world\"!"'
    

    【讨论】:

    • 非常有趣的解决方案:)
    • 到目前为止,这只是我个人对 SO 的观察。许多人认为 termimal 是一个可以让你执行一些晦涩的命令的应用程序。但它只是将您暴露给 UNIX shell 命令提示符。还有像 iTerm2 这样的其他终端软件也有同样的功能。所以恕我直言,使用通过 cron 调用的 shell 脚本是最简单的,但我知道“更简单”取决于每个人的舒适程度。
    • 不确定您所说的晦涩命令是什么意思,终端非常简单。一行代码似乎比一个新文件更可取。与舒适度无关,更多的是实用性。
    • 这比不断编辑 bash_profile 干净得多,好主意。
    【解决方案2】:

    以下答案 [在分隔符之后] 假设您要在终端中运行第二个命令 in [inside]。否则,您只需要交换 cronjob 上的命令(因为目前,正如您所拥有的那样,echo 只会在 Terminal 退出后执行),例如:

    0 23 * * * echo 'Hello, world!' && open -a Terminal
    

    现在,假设您要在新生成的终端运行命令:

    我不知道Terminal 应用程序(来自/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal)接受[即解释]任何命令行参数,也不会从[重定向到]标准输入的标准输出中读取任何内容。

    您对open -a Terminal && echo 'Hello, world!' 所做的基本上是调用Terminal 应用程序 [如果成功] 在调用上一个命令的同一个shell 上打印'Hello, world!'Terminal )。这类似于在同一个 shell 中执行两个单独的命令,但只有在第一个成功时才执行最新的命令。

    如果您希望每次为当前用户加载 bash(当前默认的 osx shell)时执行特定命令(例如 echo 'Hello, world!')(例如,每次用户打开 Terminal) ,您可以将该命令添加到~/.bash_profile。例如:

    echo "echo 'Hello, world!'" >> ~/.bash_profile
    

    现在,当您打开Terminal 时,将执行命令“echo 'Hello, world!'”。

    由于 MacOSX 的最新版本默认不包含任何用户的 ~/.bash_profile,因此您可以利用这一点并将您的 crontab 更改为:

    0 23 * * * echo "echo 'Hello, world!' > ~/.bash_profile" && open -a Terminal
    

    这基本上将在每次执行此 crontab 条目并打开 Terminal 时替换 ~/.bash_profile 的内容。

    这样做的不利之处在于,无论您在~/.bash_profile 中放入的任何内容,都将为每个打开的Terminal 执行,无论是来自 crontab 的那个,还是用户可能在任何给定时间打开的任何其他内容.

    要解决此问题,您还可以从其中删除 ~/.bash_profile 文件,方法是在 echo 'Hello, world!' 之后放置一个尾随 rm -f ~/.bash_profile 命令:

    0 23 * * * echo "echo 'Hello, world!'; rm -f ~/.bash_profile" > ~/.bash_profile" && open -a Terminal
    

    这将导致当Terminal打开并调用bash时,所有~/.bash_profile命令都会被执行,包括后面的rm -f ~/.bash_profile,所以下一次调用Terminal不会再次触发你的命令因为~/.bash_profile 不再存在。

    旁注:如果由于某种原因,您已经有一个~/.bash_profile 文件,而不是替换它的全部内容并在之后删除它,您可以备份原始文件,附加您的命令 [包括恢复原始文件]并打开终端。但我认为这不是你的情况(无论如何,如果是,我可以用细节扩展这个答案)。

    【讨论】:

    • 感谢您的详尽回答!
    【解决方案3】:

    您可以创建一个脚本说 my_cron_job.sh 并通过 cron 执行它 0 23 * * * my_cron_job.sh 指定脚本的绝对路径,例如/users/your_user_name/scripts/my_cron_job.sh

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2016-02-14
      • 2014-11-25
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      相关资源
      最近更新 更多