linux常见文件操作/sh命令问题处理
1.shell脚本不执行
-
问题:
bad interpreter: No such file or directory
-
原因:这种问题一般是由于在windows下编写的脚本,然后在上传到linux服务器的引起的,原因是:在DOS/Windows里,文本文件的换行符为rn,而在nix系统里则为n,所以DOS/Windows里编辑过的文本文件到了nix里,每一行都多了个^M。
-
解决方式有二:
1)重新在linux下编写脚本;
2)vi :% s/r//g :% s/^M//g (^M输入用Ctrl+v, Ctrl+m)
附:sh -x 脚本文件名 ,可以单步执行并回显结果,有助于排查复杂脚本问题。
2.crontab输出结果控制
- 问题:/var/spool/clientmqueue目录占用空间超过100G
- 原因:cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了/var/spool/clientmqueue目录下的那些文件,日积月累可能撑破磁盘。
- 解决:
1)直接手动删除:ls |xargs rm -f ;
2)彻底解决:在cron的自动执行语句后加上 >/dev/null 2>&1
3.telnet很慢 或者 ssh很慢
- 问题:从A服务器pingB服务器响应很快,但是从A服务器telnet或者ssh到B服务器总是很慢。
- 原因:此问题一般是
namesever
不起作用引起的。报错一般为because your PC doesn’t do a reverse DNS lookup on your IP then… when you telnet/ftp into your linux box, it’ll do a dns lookup on you.
- 解决:
- 修改/etc/hosts使hostname和ip对应;
- 在/etc/resolv.conf注释掉nameserver或者找一个“活的”或者"有效的"
nameserver
。
4.文件删了,但是磁盘空间没释放
-
问题:使用
df -h
显示某个分区的已用磁盘空间为90G,但是在该分区根目录下使用du -sh /*
显示所有使用空间加起来才30G,两者不想等。 -
原因:此问题一般是某个用户直接使用rm删除某个文件,但是该文件仍处于
正在读
或者正在写
的状态,也就是文件仍处于被占用状态,导致文件删了但磁盘空间没释放的问题 -
解决:
1)最简单重启系统或者重启相关服务。
2)干掉进程
[root@server ~]# /usr/sbin/lsof|grep deleted
ora 25575 data 33u REG 65,65 4294983680 /oradata/DATAPRE/UNDOTBS009.dbf (deleted)
从lsof的输出中,我们可以发现pid为25575的进程持有着以文件描述号(fd)为 33打开的文件/oradata/DATAPRE/UNDOTBS009.dbf。在我们找到了这个文件之后可以通过结束进程的方式来释放被占用的空 间:echo > /proc/25575/fd/33
3)删除正在写的文件一般用 cat /dev/null > file
5.find文件提升性能
- 问题:在tmp目录下有大量包含picture_*的临时文件,每天晚上2:30对一天前的文件进行清理。之前在crontab下跑如下脚本,但是发现脚本效率很低,每次执行时负载猛涨,影响到其他服务。
_#!/bin/sh
find /tmp -name “picture_*” -mtime +1 -exec rm -f {} ;
- 原因:目录下有大量文件,用find很耗资源。
- 解决:
#!/bin/sh
cd /tmp
time=`date -d “2 day ago” “+%b %d”`
ls -l|grep “picture” |grep “$time”|awk ‘{print $NF}’|xargs rm -rf
6.too many open file
-
问题:报
too many open file
错误 -
原因:此问题一般是由于已打开的文件超出linux系统的最大打开文件限制导致的。
-
解决:终极解决方案
echo “” >> /etc/security/limits.conf echo “* soft nproc 65535″ >> /etc/security/limits.conf echo “* hard nproc 65535″ >> /etc/security/limits.conf echo “* soft nofile 65535″ >> /etc/security/limits.conf echo “* hard nofile 65535″ >> /etc/security/limits.conf echo “” >> /root/.bash_profile echo “ulimit-n 65535″ >> /root/.bash_profile echo “ulimit -u 65535″ >> /root/.bash_profile
最后重启机器 或者执行
ulimit -u 655345 && ulimit -n 65535