Cron Bash 脚本 - 回显到当前终端而不是 /var/spool/mail/root

Cron Bash 脚本 - 回显到当前终端而不是 /var/spool/mail/root

Cron Bash 脚本是否可以回显到当前会话终端而不是 /var/spool/mail/root

我有一个脚本,它将错误写入日志文件,但任何补充/不重要的信息都会回显到终端。

当我以 root 身份在 cron 中运行脚本时,它将消息重定向到 /var/spool/mail/root 而不是终端。

如果 root 或其他用户登录而不是存储,我希望它们显示在终端中。如果这些消息在没有人登录时丢失,那也没关系。就像在 Cisco IOS 上一样

答案1

从 运行时没有“当前终端” cron

默认情况下,cron发送包含作业输出的电子邮件。您的本地邮件子系统将其传送到文件/var/spool/mail/$USER,您可以使用mailmailx或您首选的本地电子邮件客户端来读取它。

没有特殊原因导致您无法让cron作业将其输出写入主目录中的文件,例如如下所示:

* * * * *    date >$HOME/.current_date 2>&1

如果您正在运行 GUI,则可以使用它notify-send在屏幕上的弹出窗口中写入消息。但从 中做到这一点并不简单cron。有一个搜索围绕 StackExchange 进行解决方案到这个子问题。

如果你想写入 tty,你确实可以使用类似echo hello, world >/dev/tty1.您可能希望确保/dev/tty1在写入之前确实登录了正确的帐户(这可以通过检查设备的所有权来完成stat -c %U /dev/tty1)。

#!/bin/bash
#
me=roaima    # userid to write messages to

log()
{
    local tty owner
    for tty in $( who | awk -v me="$me" '$1 == me {print $2}' )
    do
        owner="$( stat -c %U "/dev/$tty" 2>/dev/null )"
        [[ "$me" = "$owner" ]] && echo "$@" >"/dev/$tty"
    done
}

# ...

log "hello, world"
log "this is a message for you to read RIGHT NOW"
exit 0

但是,您最好使用该write命令。例如,要在登录终端上写入用户“roaima”,您可以执行以下操作:

* * * * *    echo hello from cron | write roaima >/dev/null 2>&1

答案2

您可以使用用于向特定登录用户发送文本的实用程序。

command that produces output | write root

该文档进一步解释:

要写入多次登录的用户,可以使用terminal参数来指示写入哪个终端;否则,以实现定义的方式选择接收者的终端,并将信息性消息写入发送者的标准输出,指示选择了哪个终端。

在Red Hat/CentOS上,实现定义的方式是选择空闲时间最短的终端。

如果您希望能够写入可能登录的多个用户之一,您可以执行以下操作:

for u in root alice bob charlie
do
    if users|grep -w -q $u
    then
        user=$u
        break
    fi
done
if test -n "$user"
then
    command that produces output | write $user
fi

相关内容