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