免责声明:以下描述在 CentOS 7 中为学习目的所做的工作。
我想将 crontab 作业的输出重定向到journalctl
. 当我有以下记录时,它只是向root用户发送邮件。
# crontab -l
* * * * * echo "Hello World"
我已经读过systemd-cat
可以执行一个过程,将其输出管道到日志中。 所以我把它做了这样:
# crontab -l
* * * * * systemd-cat -t "cron-bot" echo "Hello World"
但是现在我每分钟收到两条日志消息:
{
"_TRANSPORT" : "syslog",
"SYSLOG_IDENTIFIER" : "CROND",
"MESSAGE" : "(root) CMD (systemd-cat -t "cron-bot" echo "Hello World")",
"_CMDLINE" : "systemd-cat -t cron-bot echo Hello World",
}
{
"_TRANSPORT" : "stdout",
"SYSLOG_IDENTIFIER" : "cron-bot",
"MESSAGE" : "Hello World",
"_COMM" : "echo",
}
或者,简而言之:
Sep 06 08:58:01 hostname CROND[13417]: (root) CMD (systemd-cat -t "cron-bot" echo "Hello World")
Sep 06 08:58:01 hostname cron-bot[13417]: Hello World
有人可以向我解释这种行为吗?我只想收到工作输出 (cron-bot[13417]: Hello World
( 并且不接收命令本身(CROND[13417]: ...
(,但主要是我要求这个来了解有关该主题的更多信息。
cron
记录它运行到系统日志中的每个命令,在您的系统上,系统日志也会在日志中结束。据我所知,cron
没有禁用它的选项,但您可以通过仅选择通过 stdout 接收的日记消息来隐藏这些消息:
journalctl -u cron _TRANSPORT=stdout
(-u cron
可能是 CentOS 上的-u crond
或类似的东西,我不确定。
"SYSLOG_IDENTIFIER" : "CROND"
的日志条目显示 cron 正在执行命令以及该命令是什么。
"SYSLOG_IDENTIFIER" : "cron-bot"
的日志条目显示脚本输出。
由于您使用了包含-t "cron-bot"
的journalctl
标记功能,因此您可以通过过滤从journalctl
中提取的内容来拉取所需的输出。这种-t
是设定SYSLOG_IDENTIFIER
的原因。(我想你已经知道了😉(
像这样的东西是我多次用来从日志中获取特定日志的方法:
journalctl -fet "cron-bot"
这应该只显示您的输出,而不是日志的 cron/crond 输出。
https://man7.org/linux/man-pages/man1/journalctl.1.html
-f, --follow
Show only the most recent journal entries, and continuously
print new entries as they are appended to the journal.
-e, --pager-end
Immediately jump to the end of the journal inside the implied
pager tool. This implies -n1000 to guarantee that the pager
will not buffer logs of unbounded size. This may be
overridden with an explicit -n with some other numeric value,
while -nall will disable this cap. Note that this option is
only supported for the less(1) pager.
-t, --identifier=SYSLOG_IDENTIFIER
Show messages for the specified syslog identifier
SYSLOG_IDENTIFIER.
This parameter can be specified multiple times.