调用时
/home/username/temp/build/appname 2> /home/username/temp/log/stderr 1> /home/username/temp/log/stdout
两个 stderr 都被重定向到/home/username/temp/log/stderr,而 stdout 被重定向到/home/username/temp/log/stdout。
但是,在添加 cronjob 时
5 * * * * username /home/username/temp/build/appname 2> /home/username/temp/log/stderr 1> /home/username/temp/log/stdout
应用程序按预期运行,stdout 被重定向到/home/username/temp/log/stdout,但 stderr为空。
有什么想法吗?
编辑:/etc/crontab 的顶部是
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
这个问题似乎是我的(命令行qt(应用程序独有的。以下 cronjob 适用于 stderr 的正确重定向:
* * * * * username ls /doesnotexist 2> /home/username/temp/log/ls_stderr
根据您的发行版,crontab 使用的 shell 可能与您预期的不同。我想到了两个解决方案:
-
在 crontab 中设置 shell
将
SHELL=/bin/bash
(或任何您喜欢的外壳(添加到 crontab 的顶部 -
使用 shell crontab 正在使用的重定向语法
您可以通过添加来找到外壳
* * * * * echo $SHELL > $HOME/cronshell
到你的 crontab。它很可能是/bin/sh,根据您的发行版,它可能会符号链接到不同的 shell。在这里,您可以找到不同 shell 重定向语法的精彩摘要。