1、使用trap命令对信号进行捕捉
#!/bin/bash
# 设置捕捉信号的处理函数
trap 'echo "Received SIGTERM"; exit' SIGTERM
trap 'echo "Received SIGINT"; exit' SIGINT
while true; do
echo "Running in the background..."
sleep 1
done
2、如何定位是哪个进程发送的SIGTERM或者SIGINT导致shell脚本退出
trap
中输出发送信号的进程的信息,使用 $PPID
获取当前进程的父进程(即发送信号的进程)的 PID,并使用 ps -o comm= -p $PPID
获取发送信号的进程的名称。这样在输出中就能看到是哪个进程发送了信号
#!/bin/bash
# 保存当前进程的PID
SCRIPT_PID=$$
# 设置捕捉信号的处理函数
trap 'echo "Received SIGTERM from $(ps -o comm= -p $PPID) (PID: $PPID)"; exit' SIGTERM
trap 'echo "Received SIGINT from $(ps -o comm= -p $PPID) (PID: $PPID)"; exit' SIGINT
while true; do
echo "Running in the background..."
sleep 1
done
3、shell脚本防止被信号中断
信号处理:
如果 while 循环被某个信号中断,那么后台执行的脚本可能会退出。确保后台执行的脚本不会受到不希望的信号
-
trap "" HUP # 忽略挂起信号
4、使用 nohup 或 setsid使脚本在后台独立运行
在调用后台执行的脚本时,使用 nohup
或 setsid
命令可以帮助脚本在后台独立运行,并且不受终端连接的影响
nohup /path/to/background_script.sh &
# 或者
setsid /path/to/background_script.sh &
5、标准输入、输出和错误重定向:
在后台执行的脚本中,确保标准输入(stdin)、标准输出(stdout)、标准错误(stderr)都被正确地重定向,以避免与 systemd 的执行环境有关的问题。
# 在后台执行的脚本中
while true; do
# 循环体操作
echo "Running in the background..."
sleep 1
done > /path/to/logfile.log 2>&1
6、shell脚本中一句话查找和遍历子目录对应的值
find "$base_directory" -maxdepth 1 -type d -name 'adc*' -exec sh -c 'echo "{}: $(cat {}/name) (Type: $(cat {}/value))"' \; | sort -n