模拟崩溃的bash脚本

时间:2014-05-01 22:30:03

标签: bash exception

我正在尝试测试一个bash脚本,当子进程崩溃时重启它的子进程。
如何使bash脚本故意崩溃?

(我正在尝试测试重启过程的脚本)

3 个答案:

答案 0 :(得分:9)

要在发出错误信号时退出脚本,请使用:

exit 1

以退出代码1退出,表示失败。其他非零数字可用于表示不同的故障条件。 exit 0标志着成功。

要抛出异常,请使用kill。要发出挂断信号,例如,从脚本中运行:

kill -SIGHUP $$

要查看可生成的完整信号列表,请运行:

kill -l

答案 1 :(得分:6)

你的意思是这样吗?

# this simulates a script returning exit code of 1
sh -c 'exit 1'

答案 2 :(得分:2)

为了补充@John1024's helpful answer,这里有两个演示所讨论功能的脚本:

worker:一个工作脚本,在运行后,在一段可指定的时间后杀死自己(它自己的进程),以模拟崩溃:

#!/usr/bin/env bash

n=${1:-2}  # Default to 2 seconds

echo "worker: Will self-destruct in $n seconds..."

sleep $n

echo "worker: Self-destructing..."
kill $$

monitor:在后台调用worker的脚本,等待终止,报告退出代码,然后重新启动它:

#!/usr/bin/env bash

workerScript='./worker'

# Loop that ensures that the worker script
# is launched and restarted after it terminates.
while true; do

  echo "monitor: Launching worker script in background..."
  "$workerScript" &

  # Wait for the worker script to terminate,
  # for whatever reason, and record its exit code.
  echo "monitor: Waiting for worker script to terminate..."
  # ${!} ($!) is the PID of the most recently started background command.
  # `wait` reports the specified process' exit code.
  wait ${!}; ec=$?  

  # Report worker's exit code and restart.
  echo "monitor: Worker script terminated with exit code $ec; restarting..."

done

注意:

  • kill默认使用[SIG]TERM信号,其数值为15(请参阅kill -l)。

  • 通常,信号终止的bash脚本会报告退出代码128 + <signal number>

  • 因此,在没有信号规范或kill的情况下使用-TERM会导致退出代码143;使用-HUP-SIGHUP)会产生129