1. 前言
本文记录在编写Shell脚本时遇到的问题,备忘。
2. Docker输出取值问题
2.1. 问题描述
1 |
|
这段代码的期望输出为 running,实际输出为 failed ,是为什么?
其中test容器是任意一个docker容器,比如busybox。
2.2. 问题排查解决
在docker命令执行的结果中,可能包含一些看不见的控制字符。
排查方法:使用od命令查看不可见的控制字符
1 | echo "$value" | od -c |
可以看到输出为:
1 | 0000000 " 1 0 " \r \n |
由此可以发现控制字符为 \r
和 \n
。
解决办法:进一步处理value变量,去除控制字符。
1 | value=$(echo -n "$value" | tr -d '\r\n') |
2.3. 扩展学习:od命令
od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示。通常用于显示或查看文件中不能直接显示在终端的字符。od命令系统默认的显示方式是八进制,名称源于Octal Dump。
常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。
od -c
: same as -t c, select printable characters or backslash escapes
3. 直接运行和定时任务运行结果不一致问题
3.1. 问题描述
1 |
|
上面这段代码,直接运行时结果为 running ,contab运行结果为 failed ,表现不一致,为什么?
3.2. 问题排查解决
经测试,发现 docker exec -it test echo '"10"'
命令中去掉 -it
,问题可以解决。
推测问题原因是cron作业不能添加交互式终端参数。
4. tail报错Too many open files
4.1. 问题描述
执行tail命令,报错:
1 | tail: inotify cannot be used, reverting to polling: Too many open files |
4.2. 解决办法
参考文档:
- tail: inotify cannot be used, reverting to polling: Too many open files
- How to fix: “inotify cannot be used, reverting to polling: Too many open files”
1、修改 /etc/sysctl.conf 配置
1 | vim /etc/sysctl.conf |
写入如下内容:
1 | fs.inotify.max_user_watches=1048576 |
2、重载配置文件
1 | sysctl -p |