Linux 日志、时间与计划任务命令速查
更新时间:2026-08-28。本文是 Linux 命令速查主题第⑱族:日志、时间与计划任务,约 20 个命令。这三件事看起来不相干,实际是同一类问题的不同侧面——"什么时候、发生了什么、要不要自动做"。日志管记录与留存,时间保证记录的顺序可信(多台机器对不上时间,日志就没法关联分析),计划任务负责自动化。基础的
systemd/crontab/journalctl见 软件包与服务,历史性能数据见 sar。
一、日志轮转
logrotate 做的事情很朴素:按大小或时间把日志切成多份、压缩旧的、删掉过期的。没有它,任何一个写日志的应用都能在几周内把磁盘撑满——这是生产环境最常见的"突然宕机"原因之一,且完全可预防。
| 命令 | 作用 | 常用示例 |
|---|---|---|
logrotate | 日志轮转工具,按配置切割、压缩、删除旧日志,通常由 cron 每日自动调用 | logrotate -d /etc/logrotate.conf(演练模式,只打印会做什么,不真执行);logrotate -f /etc/logrotate.conf(强制执行一次);logrotate -v /etc/logrotate.d/nginx(指定配置并输出详情) |
改完
/etc/logrotate.d/下的配置,务必先logrotate -d演练确认无误再正式跑。常见配置要点:daily或size 100M定触发条件,rotate 7保留 7 份,compress压缩,copytruncate给不支持重开日志文件的程序用(先复制再清空,避免程序拿着已删除的文件句柄继续写)。
还有个容易踩的坑:轮转之后应用还能不能正常写日志,取决于它是每次都重新打开日志文件,还是一直握着原来的文件句柄。前者用默认行为就够了;后者必须配 copytruncate,否则应用会继续往那个已经被删掉的旧文件里写,磁盘空间一点都不会释放——表现为日志看着在涨,但 df 显示的可用空间纹丝不动,du 和 df 对不上。
二、写入系统日志
syslog 是 Unix 的系统日志标准,应用把消息发给 syslog 守护进程,由它决定往哪个文件写。这样做的好处是:应用不用关心日志存哪、怎么轮转,统一交给系统管理。systemd 时代又多了 journal——一个二进制的结构化日志系统,能用 journalctl 按字段查询。
| 命令 | 作用 | 常用示例 |
|---|---|---|
logger | 从命令行向 syslog 写一条消息,脚本里打点、测试日志链路是否通畅 | logger "deploy finished";logger -p local0.err -t myscript "error occurred"(指定优先级与标签);logger -f /tmp/out.log(把文件内容写进日志) |
systemd-cat | 把命令的输出直接送进 systemd journal,让普通脚本的输出也能被 journalctl 查到 | systemd-cat ./backup.sh;systemd-cat -t backup ./backup.sh(加标识符,之后 journalctl -t backup 能查到) |
rsyslogd | 传统的 syslog 守护进程,负责接收、过滤、转发日志 | rsyslogd -N1(校验配置文件语法,改配置后必做);systemctl reload rsyslog(重载) |
systemd-journal-remote | 接收远端主机发来的 journal 日志,用于集中式日志收集 | systemd-journal-remote --listen-https=-3 --output=/var/log/journal/remote/ |
脚本里想让输出进 journald 被统一管理,直接
./script.sh 2>&1 | systemd-cat -t scriptname就行。之后journalctl -t scriptname -f可以实时跟踪,比盯着文件 tail 更规整,还能按时间范围精确查询。
三、日志查看与分析
面对几个 G 的混合日志,tail -f 只能看到最新的一小段。这几款工具解决的是"怎么看"的问题:多文件同时跟、按级别上色、结构化查询。
| 命令 | 作用 | 常用示例 |
|---|---|---|
lnav | 高级日志文件查看器,自动识别格式、按时间轴合并多个日志、支持 SQL 查询 | lnav /var/log/nginx/access.log;lnav /var/log/**/*.log(同时开多个,自动按时间合并);lnav -q(不修改日志时间戳) |
multitail | 同时监控多个日志文件并分屏显示,支持颜色高亮与过滤 | multitail /var/log/syslog /var/log/nginx/error.log;multitail -cS apache -i /var/log/apache2/access.log |
ccze | 给日志上色,让不同级别、IP、状态码一眼可辨 | tail -f /var/log/syslog | ccze -A;ccze -A < /var/log/messages(回看) |
grc | 通用的命令输出着色器,给任意命令的输出按规则上色 | grc tail -f /var/log/syslog;grc netstat -tulpn |
logwatch | 日志摘要分析工具,通常由 cron 每日运行并邮件发送报告 | logwatch --detail High --range yesterday;logwatch --service sshd --range today |
lnav是被低估的工具:它把多个日志按时间戳合并到同一条时间轴上,排查"那个时刻到底发生了什么"时不用在几个窗口间来回切时间戳。它还内建 SQLite,可以直接对日志跑 SQL 查询,比如统计某个状态码的出现次数。
四、时间同步
多台机器协作时,时间不一致会导致日志无法关联、证书校验失败、分布式锁异常。NTP(Network Time Protocol,网络时间协议)就是为此存在的。chrony 是现代发行版的默认实现,比传统的 ntpd 收敛更快,也更适合虚拟机和不稳定网络。
| 命令 | 作用 | 常用示例 |
|---|---|---|
chronyd | chrony 的时间同步守护进程,负责持续校准系统时钟 | systemctl status chronyd;chronyd -q 'server ntp.aliyun.com iburst'(一次性同步后退出) |
chronyc | chrony 的命令行管理端,查看同步状态与手动校准 | chronyc sources -v(查看时间源);chronyc tracking(同步状态与偏差);chronyc makestep(立即大步校准);chronyc -a 'burst 4/4'(加快初始同步) |
ntpq | 传统 ntpd 的查询工具,看与上游服务器的关系和偏差 | ntpq -p(列出时间源);ntpq -c rv(查看状态变量) |
ntpdate | 一次性从 NTP 服务器同步时间(较老的工具,chrony 环境下用 chronyd -q) | ntpdate -u ntp.aliyun.com |
排查时间问题先看
chronyc tracking里的Leap status和Last offset:偏差持续很大说明有硬件时钟漂移或同步被防火墙挡了(NTP 用 UDP 123)。虚拟机尤其容易漂移,一定要跑 chrony。硬件时钟与系统时钟的关系见 硬件与内核。
五、时区
| 命令 | 作用 | 常用示例 |
|---|---|---|
tzselect | 交互式选择时区,会告诉你应该设哪个 TZ 值(不直接修改系统设置) | tzselect(按提示选 Asia/China/Beijing) |
zdump | 显示指定时区的当前时间与夏令时规则,验证时区配置是否正确 | zdump Asia/Shanghai;zdump -v Asia/Shanghai(列出夏令时切换历史) |
timedatectl | systemd 的时间管理命令,查看/设置系统时间与时区(推荐用它修改) | timedatectl(查看状态);timedatectl set-timezone Asia/Shanghai(设时区);timedatectl set-ntp true(开启自动同步);timedatectl list-timezones |
容器里最常见的坑是时区:镜像默认是 UTC,应用打出的日志比北京时间早 8 小时,排查时非常容易误判时间点。解决办法是启动时挂载宿主机时区(
-v /etc/localtime:/etc/localtime:ro)或设TZ=Asia/Shanghai环境变量。
六、计划任务进阶
基础的 crontab 和 at 在第⑦族 软件包与服务 已讲,这里补上几个更专门的场景:机器关机时错过的任务、一次性后台任务、以及按目录批量执行的机制。
| 命令 | 作用 | 常用示例 |
|---|---|---|
anacron | 执行"因关机而错过"的周期性任务,适合笔记本/非 7×24 开机的机器 | anacron -T(测试配置);anacron -f(强制执行,忽略时间戳);配置在 /etc/anacrontab |
batch | 在系统负载较低时才执行的一次性任务,避免拖慢生产 | echo "backup.sh" | batch;batch < job.sh |
systemd-run | 用 systemd 临时跑一个任务单元,可设超时、资源限制、定时触发 | systemd-run --on-active=1h ./task.sh(1 小时后跑);systemd-run --on-calendar="*-*-* 03:00:00" ./backup.sh(定时);systemd-run --unit=job1 --remain-after-exit ./job.sh |
run-parts | 按顺序执行指定目录下的所有可执行脚本,cron 的 cron.daily 等目录就是靠它 | run-parts /etc/cron.daily;run-parts --test /etc/cron.hourly(只列出会执行哪些,不实际跑) |
anacron与cron的分工要分清:cron 假设机器一直开着,错过了就错过了;anacron 会在开机后补跑错过的任务。服务器用 cron 没问题,但备份这类"不能漏"的任务放在 anacron 里更稳妥。systemd-run --on-calendar是 crontab 的现代替代,优点是能用 systemd 的资源控制(CPU、内存限制)且日志自动进 journald。
一句话总结
日志时间任务速查:日志留存靠 logrotate(改配置先 -d 演练),写入用 logger/systemd-cat,分析用 lnav/multitail/ccze,时间同步交给 chronyd/chronyc(容器记得设时区),周期性任务除 crontab 外还有 anacron(补跑漏掉的)和 systemd-run(带资源限制的现代替代品)——20 个命令把"记录、对齐、自动化"串成一条链。