shell脚本自行终止的原因可能是什么?

shell脚本自行终止的原因可能是什么?

我有像这样的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已启用并且引用了未设置的变量。
  • aDEBUGERRtrap 被定义为调用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 

相关内容