业务需要,开发一个自动添加 监控 flume 进程的 crontab 任务。大概思路是 如果用户配置了 crontab 那么把所有 crontab 内容先输出到一个文件中,之后逐行读取文件中的内容,把内容重新定位到新的文件中。循环读取过程中 判断当前行是否是 flume 监控,如果是 并且 监控被注释了,就解注,并对 操作次数变量
flume_action_nums
加1,最后根据 操作变量的值, 决定是否 更新 用户的 crontab。
网上学习了一种读取 文件的方式,如下面脚本。调试时,发现,第2步 读取文件正常,在函数内 打印输出的变量值也正常,但是第3步,判断 flume_action_nums 的值时,flume_action_nums 值总为0.
问题原因:
Goole查询得知,是 管道符|
的使用问题,因为|
符两边是2个独立的子进程,他们是相互 独立执行的,所以在 第3步,获取不到 变量flume_action_nums
的值。
1. 定义整型变量:
declare -i flume_action_nums=0;
2 读取文件
cat $TMP_CRONTAB_FILE_CURRENT | while read -r line ;
do
line_has_flume_monitor=$(echo "$line" | grep -s -R "$CONSTANT_STR_GREP_KEYWORD_FLUME");
if [ "$line_has_flume_monitor" != '' ]; then
is_comment=$(echo "$line" | grep '^[[:space:]]*#*');
if [ "$is_comment" != '' ]; then
echo '--------------> Flume 监控已经添加, 但被注释掉了, 解注 ! <-----------------';
# Flume 监控被注释掉了, 去掉注释, 输出到新文件
let flume_action_nums+=1;
echo '------------ flume_action_nums = '$flume_action_nums;
echo -e "${line##*#}" >> $TMP_CRONTAB_FILE_NEW;
else
echo '--------------> Flume 监控已经添加, 运行正常 ! <-----------------';
# Flume 监控部署正常
echo "$line" >> $TMP_CRONTAB_FILE_NEW;
continue;
fi
else
## 不是 flume 监控的行, 输出到新文件
echo "$line" >> $TMP_CRONTAB_FILE_NEW;
fi
done;
3. 判断操作次数, 不为0,说明有更新操作,则更新 crontab 内容。
if [ $flume_action_nums != 0 ]; then
`cat $TMP_CRONTAB_FILE_NEW | crontab -`
echo '--------------> Flume 监控已经添加, Exit ! <-----------------';
else
echo '--------------> Flume 监控已经添加 ! <-----------------';
fi
管道符
"|" 管道符是 Linux 提供的命令操作符,管道符用 "|" 将命令隔开,管道左边命令的输出,做为 管道右边命令的输入。管道符可以同时连接多个命令。管道符 两边的命令,分别在 独立的进程中执行。
网友评论