shell 如何将任务设置为每隔一段时间运行一次?

lg40wkob  于 2023-02-19  发布在  Shell
关注(0)|答案(7)|浏览(360)

我如何让脚本每30分钟运行一次呢?我想不同的操作系统有不同的方法。我用的是OSX。

8i9zcol2

8i9zcol21#

使用launchd就可以了,它是一个非常强大的启动系统,同时也是Mac OS X的标准启动系统(当前的OS X版本没有它甚至无法 Boot )。对于那些不熟悉launchd的人(或与OS X的一般),它就像是initcronat、SysVinit之间的杂交产品(init.d),inetdupstartsystemd。借用了所有这些项目的概念,但也提供了您可能在其他地方找不到的东西。
每个服务/任务都是一个文件。文件的位置取决于以下问题:“此服务应该何时运行?”和“此服务需要哪些权限?”
系统任务转到

/Library/LaunchDaemons/

无论是否有用户登录系统,它们都将运行。它们将以“root”权限启动。
如果它们仅在任何用户登录时运行,则它们将转到

/Library/LaunchAgents/

并且将以刚登录的用户的特权来执行。
如果它们仅在登录时运行,则它们将转到

~/Library/LaunchAgents/

其中~是你的HOME目录。这些任务将使用你的权限运行,就像你自己通过命令行或双击Finder中的文件启动它们一样。
注意,还有/System/Library/LaunchDaemons/System/Library/LaunchAgents,但是和往常一样,/System下的所有东西都是由OS X管理的,你不应该在那里放置任何文件,你不应该在那里修改任何文件,除非你真的知道你在做什么。在系统文件夹里乱翻会让你的系统无法使用(让它进入一种状态,甚至会拒绝再次 Boot )这些是苹果放置launchd任务的目录,这些任务在启动期间让你的系统启动并运行,根据需要自动启动服务,执行系统维护任务,等等。
每个launchd任务都是一个PLIST格式的文件。它应该有反向域名表示法。例如,您可以命名您的任务

com.example.my-fancy-task.plist

这个plist可以有各种各样的选项和设置,初学者不适合一只手写一个,所以你可能想买一个像LaunchControl(商业版,18美元)或Lingon(商业版,14.99美元)这样的工具来创建你的任务。
例如,它可能如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

此代理将每1800秒运行一次shell脚本/usr/local/bin/my-script.sh(每30分钟)。您还可以让任务在特定日期/时间运行(基本上launchd可以做cron能做的所有事情),或者您甚至可以禁用“OnDemand”,使launchd保持进程永久运行(如果它退出或崩溃,launchd将立即重新启动它)。您甚至可以限制一个进程可以使用多少资源。

**更新:**尽管OnDemand仍然受支持,但已被弃用。新设置命名为KeepAlive,这更有意义。它可以有布尔值,在这种情况下,它与OnDemand完全相反(将其设置为false的行为就像OnDemandtrue,反之亦然)。伟大的新特性是,它也可以有字典值而不是布尔值。如果它有字典值,您有两个额外的选项,可以给予您更细粒度地控制在哪些情况下任务应该保持活动。例如,它只在程序以零退出代码终止时保持活动,只在磁盘上存在某个文件/目录时保持活动,只在另一个任务也处于活动状态时,或只在网络当前打开时保持活动。

您还可以通过命令行手动启用/禁用任务:

launchctl <command> <parameter>

命令可以是loadunload,用于加载或再次卸载plist,在这种情况下,参数是文件的路径。或者命令可以是startstop,用于启动或停止这样的任务,在这种情况下,参数是标签(com.example.my-fancy-task)。

**更新:**尽管loadunloadstartstop仍然有效,但它们现在是旧版命令。新命令是bootstrapbootoutenabledisable,语法和选项略有不同。一个很大的区别是disable是持久性的,因此一旦服务被禁用,它将保持禁用状态,即使在重新启动之后,直到您再次启用它。此外,您可以使用kickstart立即运行任务,无论它是如何配置运行的。

  • 新旧命令的主要区别是任务是通过“域”来区分的,系统有域,每个用户也有域,所以标签相同的任务可能存在于不同的域中,launctl仍然可以区分,即使同一用户的不同登录、不同UI会话也有自己的域(例如,同一用户可以一次本地登录,一次通过SSH远程登录,并且可以为任一会话运行不同的任务),并且每个单个运行的进程也是如此。现在,您可以使用system/com.example.my-fancy-taskuser/501/com.example.my-fancy-task来标识任务,其中501是特定用户的用户ID。*

请参见plist formatlaunchctl command line tool的文档。

kxeu7u2r

kxeu7u2r2#

你可以使用非常方便的plist生成器:http://launched.zerowidth.com/(不需要购买任何东西...)
它将为您提供一个shell单行程序,用于使用已经推荐的launchd注册新的调度作业

evrscar2

evrscar23#

在MacOSX上,您至少有以下选项:

  • 带有“运行脚本”操作的重复性iCal提醒
  • launchd
  • 关键字(link1link2

从个人经验来看,cron是最可靠的。当我测试的时候,launchd有很多bug和怪癖。iCal警报只在你登录的时候运行(但那可能是你更喜欢的)。

7ivaypg9

7ivaypg94#

Cron的语法

您可以使用cron来调度任务。

crontab -e

作业以下列格式指定。

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

示例:

0 12 * * *  cd ~/backupfolder && ./backup.sh
  • 翻译-每天中午运行 *

示例:

45 * * * * cd ~/backupfolder && ./backup.sh
  • 翻译-每天每小时运行一次,每次45分钟 *

注册作业

您可以以root用户身份运行脚本。

sudo crontab -e

一旦安装了cron任务,就可以使用crontab-l列出任务。

crontab -l

如果要了解有关cron调度表达式的详细信息,可以访问
https://crontab.guruhttps://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

kuarbcqp

kuarbcqp5#

正如Mecki所指出的,launchd将是实现这一点的方法,launchd有一个名为Lingon的GUI界面,您可能希望查看它,而不是手动编辑launchd文件:
Lingon是一个图形用户界面,用于为Mac OS X Leopard 10.5创建编辑启动配置文件。
[剪...]
编辑配置文件比以往任何时候都容易在这个版本中,它有两个不同的模式。基本模式,其中有一个非常简单的界面中提供的最常见的设置和Maven模式,您可以添加所有的设置要么直接在文本中或通过菜单插入它们。

rqenqsqc

rqenqsqc6#

MAC操作系统有一个Automator工具,它与Windows中的Task Scheduler相同。使用Automator,您可以每天计划任务,并将任务与循环日历事件链接,以便在每天的指定时间运行脚本。参考链接to run scripts on daily basis in Mac OS

66bbxpm5

66bbxpm57#

对于苹果脚本,我设置了一个特殊的iCal日历,并使用闹钟来周期性地运行它们,对于命令行工具,我使用launchd。

相关问题