想通过定时任务再容器里执行脚本,但再配置的过程中发现定时任务一直没有生效,后来发现问题出现在-it
上,先把错误的命令贴上来
#!/bin/bash
/usr/local/bin/nerdctl -it exec nginx "/root/logrotate.sh"
本来想执行这个脚本触发容器里的日志轮转,但是一直没有生效,问 GPT 也没有给出来一个准确答案,后来搜索了一下发现是-it
引起的,修改成如下内容就可以了
#!/bin/bash
/usr/local/bin/nerdctl exec nginx "/root/logrotate.sh"
问了 GPT,GPT 解释如下:
TTY(终端)是用户与计算机之间进行交互的接口,它提供了输入和输出的终端设备。cron 任务不依赖 TTY 的原因在于,它们是在后台自动运行的,而不需要与用户进行实时交互。
当你设置一个 cron 任务时,你指定了一个时间表和要执行的命令或脚本。这些任务被安排在操作系统的 cron 守护进程下执行,它负责按照预定的时间表触发任务。
当 cron 守护进程触发任务执行时,它会创建一个新的进程,并在其中执行指定的命令或脚本。这个新进程与 TTY 无关,因为它并不需要用户输入或与用户进行交互。
在这种情况下,输入和输出是通过其他方式处理的。cron 任务的输出通常被重定向到文件中,可以在任务设置中指定输出的目标文件。你可以在任务的命令或脚本中使用重定向操作符(如
>
)来将输出写入指定的文件。除了输出重定向外,cron 任务也可以将输出通过电子邮件发送给指定的收件人。这需要在 cron 任务的设置中配置邮件通知,并确保系统已经配置了发送电子邮件的功能。
综上所述,cron 任务在没有 TTY 的情况下执行,是因为它们是在后台自动运行的,不需要与用户进行交互。它们的输出可以通过重定向到文件或通过电子邮件通知来处理。
所以我理解的原因就是:因为加了-it
之后会分配伪终端(pseudo-TTY),但是 cron 不通过 TTY 执行,所以他就无法进到这个这个 TTY 取执行任务,导致任务不生效,能看到的就是日志里 cron 确实去执行了,但是是任务自动停止了还是跳过了就不知道。