标签:linux terminal cron scheduled-tasks macos
我在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工作同时做到这两点的任何想法?
解决方法:
以下答案[在分隔符之后]假定您要在终端的[内部]内运行第二个命令.否则你只需要交换cronjob上的命令(因为目前,就像你拥有它一样,echo只会在终端退出后执行),例如:
0 23 * * * echo 'Hello, world!' && open -a Terminal
现在,假设您要在新生成的终端中运行命令:
我不知道终端应用程序(来自/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal)接受[ie,解释]任何命令行参数,也不会读取[标准输出重定向到]标准输入的任何内容.
你正在做什么打开-a Terminal&&回声’你好,世界!’基本上是调用终端应用程序,[如果成功]打印’Hello,world!’在调用上一个命令(终端)的同一个shell上.这类似于在同一个shell中执行两个单独的命令,但只在第一个成功时才执行最新的命令.
如果你想在每次为当前用户加载bash(当前是默认的osx shell)时执行一个特定的命令(比如echo’Hello,world!’)(就像每次用户打开终端一样),你可以将该命令添加到〜/ .bash_profile.例如:
echo "echo 'Hello, world!'" >> ~/.bash_profile
现在当你打开一个终端时,命令`echo’Hello,world!’“将被执行.
由于最新版本的MacOSX默认情况下不包含任何用户的〜/ .bash_profile,因此您可以利用此功能并将crontab更改为:
0 23 * * * echo "echo 'Hello, world!' > ~/.bash_profile" && open -a Terminal
这基本上将在每次执行此crontab条目时替换〜/ .bash_profile的内容并打开终端.
这样做的缺点是无论你放在〜/ .bash_profile中,都将为每个打开的终端执行,无论是来自crontab的终端,还是任何其他用户可以在任何给定时间打开的终端.
要解决此问题,您还可以通过在echo’Hello,world!’之后放置一个尾随的rm -f~ / .bash_profile命令来从中删除〜/ .bash_profile文件:
0 23 * * * echo "echo 'Hello, world!'; rm -f ~/.bash_profile" > ~/.bash_profile" && open -a Terminal
这将导致当终端打开并调用bash时,将执行所有〜/ .bash_profile命令,包括尾随rm -f~ / .bash_profile,因此下一次调用Terminal不会再次触发你的命令,因为〜/ .bash_profile不再存在.
旁注:如果出于某种原因,您已经有了一个〜/ .bash_profile文件,而不是替换它的全部内容并在之后删除它,您可以备份原始文件,附加您的命令[包括恢复原始文件的命令]并打开终端.但我认为这不是你的情况(无论如何,如果是的话,我可以用细节扩展这个答案).
标签:linux,terminal,cron,scheduled-tasks,macos 来源: https://codeday.me/bug/20190523/1155422.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。