我有像这样的shell脚本
#!/bin/bash
while true;do
#Code HERE!
#Pushing Data to DB
echo "Data to DB"> /root/schip.log 2>&1
done
该脚本不断运行并收集服务器上的信息,然后将数据发送到数据库(时间戳数据库)。我不知道为什么,有时脚本会死掉。在日志中我看不到任何东西。同样,我在Python脚本中看到了。 Python 脚本是这样的
import <stuff>
while True:
#Code HERE
#Push data to DB
print "Data to DB"
那么,可能是什么原因造成的呢?如何预防呢?以及如何启用日志(在 python 和 Shell 中)以了解原因?谢谢!
答案1
可能导致 shell 退出的一些事情(并非详尽无遗):
- 调用
exit
实用程序。我们不要忘记显而易见的事情 - 调用
return
实用程序。在这种情况下,bash
仅在函数或源文件中才会返回。 exec cmd
。这将在同一个进程中执行,cmd
因此实际上打破了该循环。cmd
退出时脚本将结束。set -e
/set -o errexit
已启用(另请参阅SHELLOPTS
的环境变量bash
)并且命令退出并出现错误。set -u
/set -o nounset
已启用并且引用了未设置的变量。- a
DEBUG
或ERR
trap 被定义为调用exit
. - 失败特别的内置函数。特殊内置函数(如
set
、:
、eval
...)的失败会导致 shell 退出。但在这种情况下bash
,这只发生在 POSIX 模式下(例如当 POSIXLY_CORRECT 在环境中或作为sh
...调用时),甚至不适用于所有特殊的内置函数。例如: > /
将导致 shell 退出。 - 作为@schily提到的,语法错误(就像在仅有条件达到的代码中一样)。
- 除以 0(在
$((1/x))
或中${array[1/x]}
)。 bash
例如,由于达到某些限制而出现 内部错误:- 分配内存失败
- 无法分叉进程
- 超出堆栈大小(例如使用函数递归时)
- 其他限制通过
ulimit
(这也可能导致发送一些信号)。
- 被另一个进程杀死。另一个进程可以调用
kill()
显式终止脚本的解释器。 - 被系统杀了。
- 信号/信号退出。如果您按
^C
/^\
。 - 叹息。如果终端断开。
- SIGSEGV/SIGBUS/SIGILL。 bash 命令执行错误(错误)或硬件(内存)故障。
- SIGPIPE:内置 (
echo
,printf
) 写入现已关闭的管道或套接字(如果 stderr 是管道,也可能发生错误消息)。
- 信号/信号退出。如果您按
首先要检查的是错误消息和退出状态。
答案2
脚本中的语法错误将终止脚本。
如果您的脚本代码包含在某些情况下可能包含空格的 shell 变量,则在 shell 变量未用双引号引起来的情况下,可能会导致语法错误。
答案3
可能您的 Shell 正在使用“.”来获取一些外部代码。命令。
该代码由同一个 shell 实例解释。如果该代码有语法错误或该代码执行“退出”,则调用脚本将停止。该脚本可能不会在每个循环中调用,因此您的作业在失败之前会运行一段时间。
带有语法错误的示例,该错误将在 3 次循环后失败
#!/bin/sh
i=3
while true
do
let i=i-1
[ $i -eq 0 ] && . ./a 2>/dev/null
sleep 2
done
“a”脚本缺少“fi”
if true
then
echo a