为什么 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。
➡️