我一直在尝试在脚本中创建陷阱,以基本上创建一些已在后台运行的脚本日志。
每当我在陷阱中引入for循环时,脚本就会停止执行它应该执行的操作:
trap 'terminate' 10
...
write_log(){
local target=$1
local file="/tmp/"$target"_log.txt"
local lines=$(cat /tmp/"$target"_log.txt | wc -l)
printf "Log for $target\n" >> "log.txt" # This line is printed
for ((i=1;i<=$lines;i++)); # Nothing in this loop happens
do
local start_date=$(date -d "$(sed -n ""$i"p") $file | cut -f1")
local end_date=$(date -d "$sed -n ""$i"p") $file | cut -f2")
printf "Logged in $start_date, logged out $end_date" > "log.txt"
done
}
terminate(){
for target
do
echo "In the for loop!"
end_session "$target"
write_log "$target"
done
exit 0
}
当我在后台运行脚本并使用
将其终止时kill -10 (process_id)
脚本停止,并开始执行清理,直到找到for循环。当我在terminate()中删除for循环而不是对end_session()和write_log()进行单独调用时,end_session()工作得很好,而write_log()工作正常 - 直到它到达for循环。
我可能遗漏了一些基本的东西,但我现在已经看了一段时间,似乎无法弄清楚发生了什么。陷阱中的for循环是否有任何限制?
答案 0 :(得分:1)
该函数挂起,因为括号在日期命令中搞乱了。试试这个:
local start_date=$(date -d "$(sed -n ${i}p "$file" | cut -f1)")
local end_date=$(date -d "$(sed -n ${i}p "$file" | cut -f2)")