将默认 shell 更改为作业调度程序的 /bin/bash,就像在 CRON 中一样

将默认 shell 更改为作业调度程序的 /bin/bash,就像在 CRON 中一样

我最近从 切换2>&1 >>&>>

有没有办法拥有使用 /bin/bash 作为 shell?默认情况下,它使用 /bin/sh 并且手册页没有给出如何使用其他内容的指示。即使在crontab一个可以使用SHELL=/bin/bash

这给我带来的主要问题是:

echo "do-smth.sh &>> logfile" | at now + 8 hours

他们没有将 stdout 和 stderr 附加到我的日志文件中,而是完全迷失了方向,甚至没有收到电子邮件。

此解决方法不起作用,引用了意外重定向:

echo "bash <<< \"do-smth.sh &>> logfile\"" | at now + 8 hours

我使用 Linux,Ubuntu 11.10 风格,这应该不重要。

答案1

你的问题是你的命令的编写方式sh是试图处理herestring重定向,并且(在Ubuntu中链接到dash,而不是bash)它没有<<<运算符。你可能想要这个:

echo 'bash -c "do-smth.sh &>>logfile"' | at now + 8 hours

答案2

作为记录,这是我在一个用例中所经历的事情。注意如何严重地由于不可避免的单引号或双引号转义,它被混淆了:

      pidof -x pngcrush || at now <<< 'time nice bash -c '\''
(for f in $(find orderlog/ -mtime -1 -name \*.png); 
do convert -trim +repage -colors 64 -depth 6 -verbose $f $f.tmp; 
ls -lFa $f*; 
touch -r $f $f.tmp && mv -f $f.tmp $f; 
done;  
time find orderlog/ -mtime -3 -name \*.png -execdir  pngcrush -bit_depth 8 -d ~/tmp -oldtimestamp {} + ; 
mv -fv ~/tmp/*.png orderlog/; 
timeout 1h time find orderlog/ -mtime -2  \( -name \*.png -o -name \*.gif \) -execdir  optipng -keep -preserve -o6 -v  {} + ; 
rm -vf orderlog/*.png.{bak,tmp} ) &> orderlog/imgshrink.log'\'' ' 

仅在此处添加换行符以提高可读性。

由于它位于脚本内部,因此它已经发展到我应该将其转换为此处文档的位置阅读,除非我害怕破坏(非)解析巴什

答案3

#!/bin/bash为什么不在cron 运行的脚本顶部执行此操作呢?如果您使用要使用的脚本创建一个目录,则可以将其置于源代码控制之下,这样在您失去对该硬盘驱动器的访问权限时可以更轻松地进行恢复。您还可以使用 puppet、chef 或 ansible 安装这些脚本,只需在 crontab 中添加单行条目即可运行这些脚本。

相关内容