我正在尝试测试一个bash脚本,当子进程崩溃时重启它的子进程。
如何使bash脚本故意崩溃?
(我正在尝试测试重启过程的脚本)
答案 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
。