0

Shell 脚本 newb 在这里。首先感谢大家为帮助我解决这个问题所付出的任何时间和精力。

我需要创建一个 shell 脚本和一个 cron 作业来删除 /tmp 和存储在自定义目录中的会话。

几天来我一直在学习基础知识,并且正在尝试我的第一个 shell 脚本和 cron 作业。

我对运行多个 shell 命令的最佳方式感到困惑,即使其他命令失败,也允许命令通过。我还想要为那些失败的命令发送日志报告和电子邮件。

我知道我可以使用与号(&&)或分号。我还知道与号允许退出错误检查,而分号则不允许。

这是我的脚本

TmpPurge.sh

#!/bin/bash
find /home/username/sessions -iname 'sess_*' -mmin +480 -exec rm -rf {} \; &&
find /home/username/sessions -iname 'sess_*' -mmin +240 -exec rm -rf {} \; &&
/usr/sbin/tmpwatch -umc 5 /home/username/sessions &&
/usr/sbin/tmpwatch -umc 6 /var/tmp &&
/usr/sbin/tmpwatch -umc 12 /var/cache/eaccelerator

if [ $? = 0 ];
then
echo "$(date) Tmp purge completed successfully with error code: $?.  " >> /home/username/logs/TmpPurge.log
else
echo "$(date) Tmp purge exited with error code: $?.  " >> /home/username/logs/TmpPurge.log
fi
echo -e "\r" >> /home/username/logs/TmpPurge.log

定时任务:

20 3 * * * /bin/sh /home/username/scriptsdir/TmpPurge.sh > /home/username/logs/TmpPurge.log 2>&1

问题1:脚本是否正确?问题2:在多个命令之上运行的最佳方式是什么?是上面还是

find /home/username/sessions -iname 'sess_*' -mmin +480 -exec rm -rf {} \;
find /home/username/sessions -iname 'sess_*' -mmin +240 -exec rm -rf {} \;
/usr/sbin/tmpwatch -umc 5 /home/username/sessions;
/usr/sbin/tmpwatch -umc 6 /var/tmp;
/usr/sbin/tmpwatch -umc 12 /var/cache/eaccelerator

或者

/usr/sbin/tmpwatch -umc 5 /home/username/sessions\%
/usr/sbin/tmpwatch -umc 6 /var/tmp\%
/usr/sbin/tmpwatch -umc 12 /var/cache/eaccelerator\%
4

2 回答 2

1

检查错误的另一种方法是通过“||” 操作员

 command || exit 1    # Will exit with return code 1 if command fails

这个想法很简单:

&& 和 || 用于将命令链接在一起(与用于分隔命令的“;”不同)。

&& 是 AND 运算符,这意味着每个连续的命令只有在前面的命令成功时才会运行(以 0 退出)。

|| 是 OR 运算符,这意味着每个连续的命令只有在前一个命令失败时才会运行(退出时的值不是 0)。

; 用于结束命令(或命令链)。如果一行突然结束,shell(至少我知道的大多数 shell)假定该行以 ; 结尾。如果你不想这样,你需要用 \ 结束该行,但是 shell 会在将它作为一行运行之前将这些行连接在一起。

另请注意,您可以将这些链接在一起:

 echo a && echo b && ls /dir/doesnt/exist && echo c; echo d || echo e; ls /dir/doesnt/exist || echo f

将打印:

 a
 b
 d
 f

另请注意,您还可以以左关联的方式混合各种 &&s 和 ||s:

 echo a && ls /dir/doesnt/exist || echo b

印刷:

 a
 b
于 2012-09-20T23:20:31.717 回答
1

第一种方式,将命令与 链接在一起&&,将在第一个错误处停止,并报告该错误。如果您使用分号;(这实际上是不必要的,如果您将每个命令放在新行上),那么它们都会运行,无论它们是否失败,并且您的if [ $? -eq 0 ]检查只会在最后一个命令有时通知并报告错误一个错误。所以我认为这不是你想要的。

或者,您可以if [ $? -ne 0 ]在每个命令之后添加检查。也许尝试任何看起来最清晰和最容易理解的东西。

此外,使用 cron 作业清理 tmp 并且find如果-exec rm -rf {}它是多用户系统可能会很危险,只需四处搜索一下我的意思。有人可能有一些好的、安全的代码,你可以看看。

于 2012-09-20T23:12:12.973 回答