安排cron作业以打开终端并按顺序运行命令

时间:2016-08-07 03:18:02

标签: linux macos terminal cron scheduled-tasks

我计划在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工作同时执行这两项任务的想法吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

如果您希望每当为当前用户加载echo 'Hello, world!'(当前是默认的osx shell)时执行特定命令(比如说bash)(就像每次用户打开一个用户一样) 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条目时替换~/.bash_profile的内容并打开Terminal

这样做的缺点是,无论你放在~/.bash_profile内,都会为每个打开的Terminal执行任何操作,无论是crontab中的那个,还是用户可能打开的任何其他内容在任何给定的时间。

要解决此问题,您还可以通过在~/.bash_profile之后放置rm -f ~/.bash_profile命令来删除其中的echo 'Hello, world!'文件:

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

这将导致Terminal打开并调用bash时,将执行所有~/.bash_profile命令,包括尾随rm -f ~/.bash_profile,因此下一次调用{{由于Terminal不再存在,1}}不会再次触发您的命令。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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