使用-作业-systemd-定时器代替-cron (使用作业帮收费吗)

教程大全 2025-07-16 04:29:02 浏览

定时器提供了比 cron 作业更为细粒度的事件控制。

我正在致力于将我的cron作业迁移到 systemd 定时器上。我已经使用定时器多年了,但通常来说,我的学识只足以支撑我当前的工作。但在我研究systemd 系列的过程中,我发现 systemd 定时器有一些非常有意思的能力。

与 cron 作业类似,systemd 定时器可以在特定的时间间隔触发事件(shell 脚本和程序),例如每天一次或在一个月中的特定某一天(或许只有在周一生效),或在从上午 8 点到下午 6 点的工作时间内每隔 15 分钟一次。定时器也可以做到 cron 作业无法做到的一些事情。举个例子,定时器可以在特定事件发生后的一段时间后触发一段脚本或者程序去执行,例如开机、启动、上个任务完成,甚至于定时器调用的上个服务单元的完成的时刻。

操作系统维护的计时器

当在一个新系统上安装 Fedora 或者是任意一个基于 systemd 的发行版时,作为系统维护过程的一部分,它会在 Linux 宿主机的后台中创建多个定时器。这些定时器会触发事件来执行必要的日常维护任务,比如更新系统数据库、清理临时目录、轮换日志文件,以及更多其他事件。

作为示例,我会查看一些我的主要工作站上的定时器,通过执行 systemctl status *timer 命令来展示主机上的所有定时器。星号的作用与文件通配相同,所以这个命令会列出所有的 systemd 定时器单元。

[root@testvm1 ~]# systemctl status *timer● mlocate-Updatedb.timer - Updates mlocate>创建一个定时器

尽管我们可以解构一个或多个现有的计时器来了解其工作原理,但让我们创建我们自己的服务单元和一个定时器去触发它。为了保持简单,我们将使用一个相当简单的例子。当我们完成这个实验之后,就能更容易理解其他定时器的工作原理以及发现它们正在做什么。

首先,创建一个运行基础东西的简单的服务,例如命令。举个例子,你可能想定时监控空余内存。在/etc/systemd/system目录下创建如下的myMonitor.Server单元文件。它不需要是可执行文件:

# This service unit is for testing timer units# By David Both# Licensed under GPL V2#[Unit]Description=Logs system statistics to the systemd journalWants=myMonitor.timer[Service]Type=oneshotExecStart=/usr/bin/free[Install]WantedBy=multi-user.target

这大概是你能创建的最简单的服务单元了。现在我们查看一下服务状态同时测试一下服务单元确保它和我们预期一样可用。

[root@testvm1 system]# systemctl status myMonitor.service● myMonitor.service - Logs system statistics to the systemd journalLoaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled)Active: inactive (dead)[root@testvm1 system]# systemctl start myMonitor.service[root@testvm1 system]#

输出在哪里呢?默认情况下,systemd 服务单元执行程序的标准输出()会被发送到系统日志中,它保留了记录供现在或者之后(直到某个时间点)查看。(在本系列的后续文章中,我将介绍系统日志的记录和保留策略)。专门查看你的服务单元的日志,而且只针对今天。选项,即的缩写,允许你指定journalctl工具搜索条目的时间段。这并不代表你不关心过往结果 —— 在这个案例中,不会有过往记录 —— 如果你的机器以及运行了很长时间且堆积了大量的日志,它可以缩短搜索时间。

[root@testvm1 system]# journalctl -S today -u myMonitor.service-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. --Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...Jun 11 09:12:09 testvm1.both.org free[377966]:totalusedfreesharedbuff/cacheavailableJun 11 09:12:09 testvm1.both.org free[377966]: Mem:12635740522868110328608016108001211821508Jun 11 09:12:09 testvm1.both.org free[377966]: Swap:838860408388604Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.[root@testvm1 system]#

由服务触发的任务可以是单个程序、一组程序或者是一个脚本语言写的脚本。通过在myMonitor.service单元文件里的块末尾中添加如下行可以为服务添加另一个任务:

ExecStart=/usr/bin/lsblk

再次启动服务,查看日志检查结果,结果应该看上去像这样。你应该在日志中看到两条命令的结果输出:

systemd
Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...Jun 11 15:42:18 testvm1.both.org free[379961]:totalusedfreesharedbuff/cacheavailableJun 11 15:42:18 testvm1.both.org free[379961]: Mem:12635740531788110195408024108441211812272Jun 11 15:42:18 testvm1.both.org free[379961]: Swap:838860408388604Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINTJun 11 15:42:18 testvm1.both.org lsblk[379962]: sda8:00120G0 diskJun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─sda18:104G0 part /bootJun 11 15:42:18 testvm1.both.org lsblk[379962]: └─sda28:20116G0 partJun 11 15:42:18 testvm1.both.org lsblk[379962]:├─VG01-root 253:005G0 lvm/Jun 11 15:42:18 testvm1.both.org lsblk[379962]:├─VG01-swap 253:108G0 lvm[SWAP]Jun 11 15:42:18 testvm1.both.org lsblk[379962]:├─VG01-usr253:2030G0 lvm/usrJun 11 15:42:18 testvm1.both.org lsblk[379962]:├─VG01-tmp253:3010G0 lvm/tmpJun 11 15:42:18 testvm1.both.org lsblk[379962]:├─VG01-var253:4020G0 lvm/varJun 11 15:42:18 testvm1.both.org lsblk[379962]:└─VG01-home 253:5010G0 lvm/homeJun 11 15:42:18 testvm1.both.org lsblk[379962]: sr011:01 1024M0 romJun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.

现在你知道了你的服务可以按预期工作了,在/etc/systemd/system目录下创建myMonitor.timer定时器单元文件,添加如下代码:

# This timer unit is for testing# By David Both# Licensed under GPL V2#[Unit]Description=Logs some system statistics to the systemd journalRequires=myMonitor.service[Timer]Unit=myMonitor.serviceOnCalendar=*-*-* *:*:00[Install]WantedBy=timers.target

myMonitor.timer文件中的OnCalendar时间格式,*-*-* *:*:00,应该会每分钟触发一次定时器去执行myMonitor.service单元。我会在文章的后面进一步探索OnCalendar设置。

到目前为止,在服务被计时器触发运行时观察与之有关的日志记录。你也可以跟踪计时器,跟踪服务可以让你接近实时的看到结果。执行journalctl时带上选项:

[root@testvm1 system]# journalctl -S today -f -u myMonitor.service-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --

执行但是不启用该定时器,看看它运行一段时间后发生了什么:

[root@testvm1 ~]# systemctl start myMonitor.service[root@testvm1 ~]#

一条结果立即就显示出来了,下一条大概在一分钟后出来。观察几分钟日志,看看你有没有跟我发现同样的事情:

[root@testvm1 system]# journalctl -S today -f -u myMonitor.service-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.Jun 13 08:39:19 testvm1.both.org free[630566]:totalusedfreesharedbuff/cacheavailableJun 13 08:39:19 testvm1.both.org free[630566]: Mem:12635740556604109655168036111362011785628Jun 13 08:39:19 testvm1.both.org free[630566]: Swap:838860408388604Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINTJun 13 08:39:19 testvm1.both.org lsblk[630567]: sda8:00120G0 diskJun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─sda18:104G0 part /bootJun 13 08:39:19 testvm1.both.org lsblk[630567]: └─sda28:20116G0 partJun 13 08:39:19 testvm1.both.org lsblk[630567]:├─VG01-root 253:005G0 lvm/Jun 13 08:39:19 testvm1.both.org lsblk[630567]:├─VG01-swap 253:108G0 lvm[SWAP]Jun 13 08:39:19 testvm1.both.org lsblk[630567]:├─VG01-usr253:2030G0 lvm/usrJun 13 08:39:19 testvm1.both.org lsblk[630567]:├─VG01-tmp253:3010G0 lvm/tmpJun 13 08:39:19 testvm1.both.org lsblk[630567]:├─VG01-var253:4020G0 lvm/varJun 13 08:39:19 testvm1.both.org lsblk[630567]:└─VG01-home 253:5010G0 lvm/homeJun 13 08:39:19 testvm1.both.org lsblk[630567]: sr011:01 1024M0 romJun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...Jun 13 08:40:46 testvm1.both.org free[630572]:totalusedfreesharedbuff/cacheavailableJun 13 08:40:46 testvm1.both.org free[630572]: Mem:12635740555228109668368036111367611786996Jun 13 08:40:46 testvm1.both.org free[630572]: Swap:838860408388604Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINTJun 13 08:40:46 testvm1.both.org lsblk[630574]: sda8:00120G0 diskJun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─sda18:104G0 part /bootJun 13 08:40:46 testvm1.both.org lsblk[630574]: └─sda28:20116G0 partJun 13 08:40:46 testvm1.both.org lsblk[630574]:├─VG01-root 253:005G0 lvm/Jun 13 08:40:46 testvm1.both.org lsblk[630574]:├─VG01-swap 253:108G0 lvm[SWAP]Jun 13 08:40:46 testvm1.both.org lsblk[630574]:├─VG01-usr253:2030G0 lvm/usrJun 13 08:40:46 testvm1.both.org lsblk[630574]:├─VG01-tmp253:3010G0 lvm/tmpJun 13 08:40:46 testvm1.both.org lsblk[630574]:├─VG01-var253:4020G0 lvm/varJun 13 08:40:46 testvm1.both.org lsblk[630574]:└─VG01-home 253:5010G0 lvm/homeJun 13 08:40:46 testvm1.both.org lsblk[630574]: sr011:01 1024M0 romJun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...Jun 13 08:41:46 testvm1.both.org free[630580]:totalusedfreesharedbuff/cacheavailableJun 13 08:41:46 testvm1.both.org free[630580]: Mem:12635740553488109685648036111368811788744Jun 13 08:41:46 testvm1.both.org free[630580]: Swap:838860408388604Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINTJun 13 08:41:47 testvm1.both.org lsblk[630581]: sda8:00120G0 diskJun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─sda18:104G0 part /bootJun 13 08:41:47 testvm1.both.org lsblk[630581]: └─sda28:20116G0 partJun 13 08:41:47 testvm1.both.org lsblk[630581]:├─VG01-root 253:005G0 lvm/Jun 13 08:41:47 testvm1.both.org lsblk[630581]:├─VG01-swap 253:108G0 lvm[SWAP]Jun 13 08:41:47 testvm1.both.org lsblk[630581]:├─VG01-usr253:2030G0 lvm/usrJun 13 08:41:47 testvm1.both.org lsblk[630581]:├─VG01-tmp253:3010G0 lvm/tmpJun 13 08:41:47 testvm1.both.org lsblk[630581]:├─VG01-var253:4020G0 lvm/varJun 13 08:41:47 testvm1.both.org lsblk[630581]:└─VG01-home 253:5010G0 lvm/homeJun 13 08:41:47 testvm1.both.org lsblk[630581]: sr011:01 1024M0 romJun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.

别忘了检查下计时器和服务的状态。

你在日志里大概至少注意到两件事。第一,你不需要特地做什么来让myMonitor.service单元中触发器产生的存储到日志里。这都是用 systemd 来运行服务的一部分功能。然而,它确实意味着你需要小心对待服务单元里面执行的脚本和它们能产生多少。

第二,定时器并不是精确在每分钟的 :00 秒执行的,甚至每次执行的时间间隔都不是刚好一分钟。这是特意的设计,但是有必要的话可以改变这种行为(如果只是它挑战了你的系统管理员的敏感神经)。

这样设计的初衷是为了防止多个服务在完全相同的时刻被触发。举个例子,你可以用例如 Weekly,Daily 等时间格式。这些快捷写法都被定义为在某一天的 00:00:00 执行。当多个定时器都这样定义的话,有很大可能它们会同时执行。

systemd 定时器被故意设计成在规定时间附近随机波动的时间点触发,以避免同一时间触发。它们在一个时间窗口内半随机触发,时间窗口开始于预设的触发时间,结束于预设时间后一分钟。根据systemd.timer的手册页,这个触发时间相对于其他已经定义的定时器单元保持在稳定的位置。你可以在日志条目中看到,定时器在启动后立即触发,然后在每分钟后的 46 或 47 秒触发。

大部分情况下,这种概率抖动的定时器是没事的。当调度类似执行备份的任务,只需要它们在下班时间运行,这样是没问题的。系统管理员可以选择确定的开始时间来确保不和其他任务冲突,例如 01:05:00 这样典型的 cron 作业时间,但是有很大范围的时间值可以满足这一点。在开始时间上的一个分钟级别的随机往往是无关紧要的。

然而,对某些任务来说,精确的触发时间是个硬性要求。对于这类任务,你可以向单元文件的块中添加如下声明来指定更高的触发时间跨度精确度(精确到微秒以内):

AccuracySec=1us

时间跨度可用于指定所需的精度,以及定义重复事件或一次性事件的时间跨度。它能识别以下单位:

所有/usr/lib/systemd/system中的定时器都指定了一个更宽松的时间精度,因为精准时间没那么重要。看看这些系统创建的定时器的时间格式:

[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h[root@testvm1 system]#

看下/usr/lib/systemd/system目录下部分定时器单元文件的完整内容,看看它们是如何构建的。

在本实验中不必让这个定时器在启动时激活,但下面这个命令可以设置开机自启:

[root@testvm1 system]# systemctl enable myMonitor.timer

你创建的单元文件不需要是可执行的。你同样不需要启用服务,因为它是被定时器触发的。如果你需要的话,你仍然可以在命令行里手动触发该服务单元。尝试一下,然后观察日志。

关于定时器精度、事件时间规格和触发事件的详细信息,请参见 systemd.timer 和 systemd.time 的手册页。

定时器类型

systemd 定时器还有一些在 cron 中找不到的功能,cron 只在确定的、重复的、具体的日期和时间触发。systemd 定时器可以被配置成根据其他 systemd 单元状态发生改变时触发。举个例子,定时器可以配置成在系统开机、启动后,或是某个确定的服务单元激活之后的一段时间被触发。这些被称为单调计时器。“单调”指的是一个持续增长的计数器或序列。这些定时器不是持久的,因为它们在每次启动后都会重置。

表格 1 列出了一些单调定时器以及每个定时器的简短定义,同时有OnCalendar定时器,这些不是单调的,它们被用于指定未来有可能重复的某个确定时间。这个信息来自于systemd.timer的手册页,有一些不重要的修改。

定时器单调性定义
OnActiveSec=定义了一个与定时器被激活的那一刻相关的定时器。
OnBootSec=定义了一个与机器启动时间相关的计时器。
OnStartupSec=定义了一个与服务管理器首次启动相关的计时器。对于系统定时器来说,这个定时器与OnBootSec=类似,因为系统服务管理器在机器启动后很短的时间后就会启动。当以在每个用户服务管理器中运行的单元进行配置时,它尤其有用,因为用户的服务管理器通常在首次登录后启动,而不是机器启动后。
OnUnitActiveSec=定义了一个与将要激活的定时器上次激活时间相关的定时器。
OnUnitInactiveSec=定义了一个与将要激活的定时器上次停用时间相关的定时器。
OnCalendar=定义了一个有日期事件表达式语法的实时(即时钟)定时器。查看systemd.time(7)的手册页获取更多与日历事件表达式相关的语法信息。除此以外,它的语义和OnActiveSec=类似。

Table 1: systemd 定时器定义

单调计时器可使用同样的简写名作为它们的时间跨度,即我们之前提到的AccuracySec表达式,但是 systemd 将这些名字统一转换成了秒。举个例子,比如你想规定某个定时器在系统启动后五天触发一次事件;它可能看起来像OnBootSec=5d。如果机器启动于2020-06-15 09:45:27,这个定时器会在2020-06-20 09:45:27或在这之后的一分钟内触发。

日历事件格式

日历事件格式是定时器在所需的重复时间触发的关键。我们开始看下一些OnCalendar设置一起使用的格式。

systemd 定时器使用OnCalendar=的基础格式是DOW YYYY-MM-DD HH:MM:SS。DOW(星期几)是选填的,其他字段可以用一个星号()来匹配此位置的任意值。所有的日历时间格式会被转换成标准格式。如果时间没有指定,它会被设置为。如果日期没有指定但是时间指定了,那么下次匹配的时间可能是今天或者明天,取决于当前的时间。月份和星期可以使用名称或数字。每个单元都可以使用逗号分隔的列表。单元范围可以在开始值和结束值之间用指定。

这里有几个在OnCalendar表达式中使用的典型时间格式例子。

DOW YYYY-MM-DD HH:MM:SS
*-*-* 00:15:30每年每月每天的 0 点 15 分 30 秒
每个周一的 00:00:00
Mon *-*-* 00:00:00同上
同上
Wed 2020-*-*2020 年每个周三的 00:00:00
Mon..Fri 2021-*-*2021 年的每个工作日(周一到周五)的 00:00:00
2022-6,7,8-1,15 01:15:002022 年 6、7、8 月的 1 到 15 号的 01:15:00
Mon *-05~03每年五月份的下个周一同时也是月末的倒数第三天
Mon..Fri *-08~04任何年份 8 月末的倒数第四天,同时也须是工作日
五月末的倒数第三天,然后 2 天后再来一次。每年重复一次。注意这个表达式使用了波浪号()。
五月的第三天,然后每两天重复一次直到 5 月底。注意这个表达式使用了破折号()。

Table 2:OnCalendar事件时间格式例子

测试日历格式

systemd 提供了一个绝佳的工具用于检测和测试定时器中日历时间事件的格式。systemd-analyze calendar工具解析一个时间事件格式,提供标准格式和其他有趣的信息,例如下次“经过”(即匹配)的日期和时间,以及距离下次触发之前大概时间。

首先,看看未来没有时间的日(注意Next elapse和的时间会根据你当地时区改变):

[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17 Original form: 2030-06-17        Normalized form: 2030-06-17 00:00:00      Next elapse: Mon 2030-06-17 00:00:00 EDT   (in UTC): Mon 2030-06-17 04:00:00 UTC   from now: 10 years 0 months LEFT  [root@testvm1 system]#
[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16 Original form: 2030-06-17        Normalized form: 2030-06-17 00:00:00      Next elapse: Mon 2030-06-17 00:00:00 EDT   (in UTC): Mon 2030-06-17 04:00:00 UTC   From now: 10 years 0 months left   Original form: 15:21:16         Normalized form: *-*-* 15:21:16        Next elapse: Mon 2020-06-15 15:21:16 EDT   (in UTC): Mon 2020-06-15 19:21:16 UTC   From now: 3h 55min left       [root@testvm1 system]#

为了把日期和时间当作一个单元来分析,可以把它们包在引号里。你在定时器单元里OnCalendar=时间格式中使用的时候记得把引号去掉,否则会报错:

[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16"Normalized form: 2030-06-17 15:21:16      Next elapse: Mon 2030-06-17 15:21:16 EDT   (in UTC): Mon 2030-06-17 19:21:16 UTC   From now: 10 years 0 months left  [root@testvm1 system]#

现在我们测试下 Table2 里的例子。我尤其喜欢最后一个:

[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00" Original form: 2022-6,7,8-1,15 01:15:00Normalized form: 2022-06,07,08-01,15 01:15:00  Next elapse: Wed 2022-06-01 01:15:00 EDT   (in UTC): Wed 2022-06-01 05:15:00 UTC   From now: 1 years 11 months left[root@testvm1 system]#

让我们看一个例子,这个例子里我们列出了时间表达式的五个经过时间。

[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3" Original form: Mon *-05~3        Normalized form: Mon *-05~03 00:00:00     Next elapse: Mon 2023-05-29 00:00:00 EDT   (in UTC): Mon 2023-05-29 04:00:00 UTC   From now: 2 years 11 months left     Iter. #2: Mon 2028-05-29 00:00:00 EDT   (in UTC): Mon 2028-05-29 04:00:00 UTC   From now: 7 years 11 months left     Iter. #3: Mon 2034-05-29 00:00:00 EDT   (in UTC): Mon 2034-05-29 04:00:00 UTC   From now: 13 years 11 months left     Iter. #4: Mon 2045-05-29 00:00:00 EDT   (in UTC): Mon 2045-05-29 04:00:00 UTC   From now: 24 years 11 months left     Iter. #5: Mon 2051-05-29 00:00:00 EDT   (in UTC): Mon 2051-05-29 04:00:00 UTC   From now: 30 years 11 months left  [root@testvm1 ~]#

这些应该为你提供了足够的信息去开始测试你的OnCalendar时间格式。systemd-analyze工具可用于其他有趣的分析,我会在这个系列的下一篇文章来探索这些。

总结

systemd 定时器可以用于执行和 cron 工具相同的任务,但是通过按照日历和单调时间格式去触发事件的方法提供了更多的灵活性。

虽然你为此次实验创建的服务单元通常是由定时器调用的,你也可以随时使用systemctl start myMonitor.service命令去触发它。可以在一个定时器中编写多个维护任务的脚本;它们可以是 Bash 脚本或者其他 Linux 程序。你可以通过触发定时器来运行所有的脚本来运行服务,也可以按照需要执行单独的脚本。

我会在下篇文章中更加深入的探索 systemd 时间格式的用处。

我还没有看到任何迹象表明 cron 和 at 将被废弃。我希望这种情况不会发生,因为至少在执行一次性调度任务的时候要比 systemd 定时器容易的多。

参考资料

网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。

此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要实现者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章:



SQL 定时执行存储过程

如果是SQL Server2000,就在企业管理器里添加一个作业1、开启代理服务sql server agent2、在企业管理器里,打开“管理—>sqlserver代理—>作业”,新增作业,新建“步骤”,在步骤里填入你要执行的语句,比如“exec abc”到“命令”框里。 然后新建“调度”。 设置好自动执行的时间。 3、启动作业。

格力空调怎么进入强制制冷模式

格力空调怎样设置制冷模式,步骤如下:1、找到格力空调的遥控器,不同型号外观稍有不同。 2、打开空调,按下开关键。 3、开启后,选择“制冷”模式按钮,如下图所示:4、这样就切换到制冷模式了,可以选择上下键来调节温度就可以了。 扩展资料:格力空调制冷时的注意事项:1,若感到室内温度过高,可适当降低设定温度。 2,有效使用定时器,可达到既节能又舒适的效果。 3,空调房间内人员不可过多、过挤、否则冷量显得不足,温度难以下降;4,房间门窗不可频繁开关,人员不可频繁进出,以免冷气损失;

什么是不定时工作制?

不定时工作制是针对因生产特点、工作特殊需要或职责范围的关系,无法按标准工作时间衡量或需要机动作业的职工所采用的一种工时制度。 例如:企业中从事高级管理、推销、货运、装卸、长途运输驾驶、押运、非生产性值班和特殊工作形式的个体工作岗位的职工,出租车驾驶员等,可实行不定时工作制。 鉴于每个企业的情况不同,企业可依据上述原则结合企业的实际情况进行研究,并按有关规定报批。 很多企业和员工对实行不定时工作制是否需支付加班费不是很清楚,在实践中常常引发劳动争议,就这个问题,《劳动法》第三十九条规定:“企业因生产特点不能实行三十六条规定的,经劳动行政部门批准,可以实行其他工作和休息办法”。 “其他工作和休息办法”具体是指“不定时工作制”和“综合计算工时工作制”两种。 “不定时工作制”是不以标准工时制度确定的工作制度,企业以合理确定劳动者的劳动定额或其他考核标准来确定劳动者的工作时间和休息时间。 “综合计算工时工作制”是分别以周、月、季、年等为周期,综合计算工作时间,但规定的条件是“其平均日工作时间和平均周工作时间应与法定标准工作时间基本相同”。 原劳动部《关于企业实行不定时工作制和综合计算工时工作制的审批办法》规定,企业对符合下列条件之一的职工,可以实行不定时工作制:一、企业中的高级管理人员、外勤人员、推销人员、部分值班人员和其他因工作无法按标准工作时间衡量的职工;二、企业中的长途运输人员、出租汽车司机和铁路、港口、仓库的部分装卸人员以及因工作性质特殊,需机动作业的职工;三、其他因生产特点、工作特殊需要或职责范围的关系,适合实行不定时工作制的职工。 不定时工作制度是相对标准工时制度而言的一种工时制度,是指每一工作日没有固定的上下班时间限制的工作时间制度,它是针对因生产特点、工作特殊需要或职责范围的关系,无法按标准工作时间衡量而需要机动作业的职工所采用的一种工时制度。 对于实行不定时工作制的劳动者,用人单位应根据标准工时制度合理确定劳动者的劳动定额或其他考核标准,以便保证劳动者休息。 其工资应当按照本单位工资制度和工资分配办法,根据劳动者的实际工作时间和完成劳动定额的情况,在劳动合同中进行明确约定。 对于符合带薪年休假条件的劳动者,企业可安排其享受带薪年休假。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐