为什么 nohup 在 crontab 中不起作用

💡 原文中文,约2700字,阅读约需7分钟。
📝

内容提要

在 crontab 中使用 nohup 无效,因为 cron 执行命令时 stdout 和 stderr 连接到管道,而不是终端。正确的做法是直接将输出重定向到文件,例如 `/path/to/command >> /path/to/output.log 2>&1`,避免使用 nohup 和 &。

🎯

关键要点

  • 在 crontab 中使用 nohup 无效,因为 cron 执行命令时 stdout 和 stderr 连接到管道,而不是终端。
  • nohup 的功能包括忽略 SIGHUP 信号和将输出重定向到 nohup.out,但只有在 stdout 是终端时才会生效。
  • crontab 执行命令时,stdout 和 stderr 是管道,因此 nohup 不会创建 nohup.out,输出会发送到系统邮件。
  • 在 crontab 中,正确的做法是直接将输出重定向到文件,例如 '/path/to/command >> /path/to/output.log 2>&1'。
  • 使用 nohup 和 & 是不必要的,因为 cron 会为每个任务 fork 一个独立的子进程,不会阻塞主调度循环。

延伸问答

为什么在 crontab 中使用 nohup 无效?

因为 cron 执行命令时 stdout 和 stderr 连接到管道,而不是终端,导致 nohup 不会创建 nohup.out。

如何正确处理 crontab 中的命令输出?

应直接将输出重定向到文件,例如 '/path/to/command >> /path/to/output.log 2>&1'。

nohup 的主要功能是什么?

nohup 的主要功能是忽略 SIGHUP 信号和将输出重定向到 nohup.out,但仅在 stdout 是终端时有效。

为什么在 crontab 中不需要使用 & 符号?

因为 cron 会为每个任务 fork 一个独立的子进程,不会阻塞主调度循环,因此不需要手动放到后台。

如果不想收到系统邮件,如何处理命令输出?

可以将输出重定向到 /dev/null,例如 '/path/to/command > /dev/null 2>&1'。

在 crontab 中执行长时间任务时需要注意什么?

如果任务运行时间超过 crontab 的调度间隔,可能会出现重复执行的问题,可以考虑加入锁机制或使用 systemd timer。

➡️

继续阅读