找回linux丢失的磁盘空间
最近一台服务器空间总是报警,磁盘空间不足。
使用 df 命令查看,磁盘空间耗用接近 100%,将机器上过期的数据以及日志清理掉,但是空间很快又是接近 100%。
使用 du 查看,想找出磁盘空间被耗用在哪里了,结果发现他输出的结果和df命令输出的结果相差很大,离100%空间占用还远着呢。
丢失的空间跑哪了,是磁盘损坏了吗?
使用google搜索了一下,发现两个可能的原因:
1. 磁盘文件删除后,但是原先对应写文件的进程还在,仍然抓着那个文件,在往里面写数据,空间继续被他耗用,同时删除后的空间得不到释放,du 命令也看不到这个文件占用的空间。
2. 使用mount命令,挂载到一个原本有数据的目录,之前目录下的文件不可见也不会被du看到统计
因为这台服务器没有做特殊目录挂载,所以按照问题1查找丢失的空间。
使用 lsof | grep deleted 查找被删除的文件,果然发现一个巨大的日志文件
在外面kill掉写这个日志文件的进程,发现磁盘空间一点一点被释放回来了
重新运行进程,发现日志也被正常写入。
Popularity: 9% [?]
Related
Linux每进程线程数问题处理
公司的一台服务器升级,原先运行正常的一个服务经常会跳出,于是予以分析解决。
该服务是一个tcp的服务端程序,被动接收客户端连接处理数据,升级后当客户端连接到一定量后程序会自动跳出。
使用netstat查看各个状态的数量
netstat -na |awk ‘{print $6}’|sort |uniq -c |sort -nr
发现很多的CLOSE_WAIT,并且还在不断增加中。
觉得可能是CLOSE_WAIT得不到释放,占用很多资源,
于是修改sysctl.conf中关于tcp连接的连接时间等设置,结果问题依旧。
怀疑收到攻击,使用
netstat -na |grep CLOSE_WAIT|awk ‘{print $5}’|awk -F”:” ‘{print $1}’|sort |uniq -c |sort -nr |wc -l 查看连接过来的地址,发现都是地址来源都是正常的
首先检查
使用 ps -fe |grep programname 查看获得进程的pid
再使用 ps -Lf pid 查看对应进程下的线程数,发现数值为303,远小于实际应该的数量。于是初步判断是由于线程数不够造成的原因。查找资料发现可以通过设置 ulimit -s 来增加每进程线程数。
每进程可用线程数 = VIRT上限/stack size
其中 VIRT 上限: 32位x86 = 3G 64位x64=64G
statck size 默认是 10240 因此在默认情况下
32位系统上单进程最多可以创建300个线程,
64系统在内存充足的情况下最多可以创建 6400 个线程。
在机器硬件固定的情况下,可以通过 ulimit -s 降低stack size 的设置值来获得更多的每进程线程数。
Popularity: 8% [?]
Related
给fast-cgi方式的php做一个检查脚本
使用fast-cgi方式的php在使用,有时候由于编写的代码问题,使处理代码的php-cgi进程的运行占用很多时间,在将所有活动的 php-cgi 进程都占用后,web服务器对php的请求就失去响应了。
通过命令查看服务器上一共开了多少的 php-cgi 进程
-
ps -fe |grep "php" | grep -v "grep" | wc -l
使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求
-
netstat -anop | grep "php" | grep -v "grep" | wc -l
当被使用的php进程接近所开启的php进程数时,可以考虑将被耗用的php进程释放一下,以防止网站访问的阻塞。
按照以上思路编写了一个检查脚本。
-
#
-
#!/bin/sh
-
#
-
-
echo "begin check"
-
-
#define default check delta num
-
defdeltacount=10
-
-
phpcount=`ps -fe |grep "php" | grep -v "grep" | wc -l`
-
netstatcount=`sudo netstat -anop | grep "php" | grep -v "grep" | wc -l`
-
-
echo " php process count is $phpcount
-
netstat process count is $netstatcount"
-
-
deltacount=`expr $phpcount – $netstatcount`
-
-
if [ -n "$1" ]; then
-
defdeltacount=$1
-
fi
-
-
echo "deltacount is $deltacount, defdeltacount is $defdeltacount"
-
-
if [ $deltacount -lt $defdeltacount ]; then
-
echo " need reset"
-
sudo /root/tools/resetphp.sh
-
else
-
echo " not need reset"
-
fi
-
-
echo "check end"
其中 /root/tools/resetphp.sh 为编写的php重启脚本。
脚本可以放到 crontab 中,做自动定时检查处理。
Popularity: 5% [?]
Related
编译mogileFS的php模块
下载 php 的mofileFS 模块, 下载地址在http://www.sunnyu.com/?p=10有列出
1. 解压
2. 执行 phpize 命令
3. 执行 ./configure –with-php-config=/usr/local/php526/bin/php-config
4. 执行 make
碰到错误,原来是没有安装 neon 开发包,于是在linux安装盘上找到 neon-0.24.7-4.i386.rpm, neon-devel-0.24.7-4.i386.rpm
将其安装上
-
rpm -ivh neon-0.24.7-4.i386.rpm
-
rpm -ivh neon-devel-0.24.7-4.i386.rpm
再使用 make ,一切正常
5. make install
记录下拷贝到的路径
6. 修改php.ini 里面添加上新的模块
再module部分添加上上面记录下的文件路径
7. 编写一个php 页面做测试
Popularity: 5% [?]
Related
为Linux安装NTP时间同步服务
一组Linux服务器常有时间不一致,这就需要安装ntp时间同布服务.
安装NTP服务端
1.安装ntp服务包,这个在安装盘上基本都有的,没有的找一下rpm包,安装一下
2.找到系统可以访问使用的基准时间服务器,一个公共地址 www.ntp.org
3.配置 /etc/ntp.conf,主要设置 server和driftfile两项设置
4.启动 ntp 后台服务
-
service ntpd start
5. 不要忘记打开iptables中的端口限制
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT
一些免费的 标准时间服务器
cn.asia.pool.ntp.org
0.asia.pool.ntp.org
1.asia.pool.ntp.org
客户端机器配置
1.同样也开一个ntp服务
2.使用一个crontab定时和内部的ntp服务器作时间同步
*/30 * * * * /usr/sbin/ntpdate 192.168.0.11
Popularity: 4% [?]
Related
IPTables默认没有对Output设置限制规则
今天一个不小心,发现了一个以前一直没有注意的问题,那就是Redhat的iptables默认是不对output做限制的。
:INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT
为了简单添加对output的限制,还需要在
-A INPUT -j RH-Firewall-1-INPUT
后添加一行
-A OUTPUT -j RH-Firewall-1-INPUT
这样重启iptables服务后,本机对外部的访问如果不在规则内才会被禁止。
Popularity: 4% [?]
Related
Linux操作ISO的一些命令
要做ISO文件的打包查看,于是对一些ISO相关命令做下备忘。
- ISO文件加载
-
mount -t iso9660 -o loop xxx.iso /path
- 从光盘制作ISO文件
-
cp /dev/cdrom xxx.iso
-
dd if=/dev/cdrom of=/root/xxx.iso
- 从文件目录制作ISO文件
-
cp -r /path xxx.iso
-
mkisofs -o name.iso /path
-
mkisofs -o name.iso -r /path
-
mkisofs -a -l -J -L -r -o xxx.iso /path
-
wget http://kegel.com/crosstool/crosstool-0.43.tar.gz
-
tar -xzvf crosstool-0.43.tar.gz
-
cd crosstool-0.43
-
cat demo-arm9tdmi.sh
将xxx.iso文件加载到 /path 目录下
Popularity: 4% [?]
Related
在linux下使用crosstool-0.43制作自己的arm交叉编译环境
crosstool是个不错的软件,能够很方便的编译自己的交叉编译环境
目前最新版本crosstool-0.43 在地址 http://kegel.com/crosstool/crosstool-0.43.tar.gz 可以下载。
首先获取工具包,解压后进入其目录
选择自己希望的模板,这儿是以arm9做试验玩,因此选择了 demo-arm9tdmi.sh 做模板。
可以看到
#!/bin/sh # This script has one line for each known working toolchain # for this architecture. Uncomment the one you want. # Generated by generate-demo.pl from buildlogs/all.dats.txt set -ex TARBALLS_DIR=/home/lpsc/downloads RESULT_TOP=/home/lpsc/crosstool export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES # Really, you should do the mkdir before running this, # and chown /opt/crosstool to yourself so you don't need to run as root. mkdir -p $RESULT_TOP #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest echo Done.
其中红色字为自己修改的地方,看最后一个红色的行,表示我们要编译 gcc 4.1.0 的。
-
cat arm9tdmi.dat
可以看到
KERNELCONFIG=`pwd`/arm.config TARGET=arm-9tdmi-linux-gnu GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi" TARGET_CFLAGS="-O"
其中红色的文字可以根据自己的需要做修改,一般是 arm-linux ,符合网上面很多编译情形的。
-
cat gcc-4.1.0-glibc-2.3.2-tls.dat
可以看到
BINUTILS_DIR=binutils-2.16.1 GCC_CORE_DIR=gcc-3.3.6 GCC_DIR=gcc-4.1.0 GLIBC_DIR=glibc-2.3.2 LINUX_DIR=linux-2.6.15.4 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 GDB_DIR=gdb-6.5 GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread --enable-kernel=2.4.18"
将红色的字对应的bz2包下载下来(这些文件我基本都是在 chinaunix 那儿下载的,下载速度很快),放到前面设定的 /home/lpsc/downloads目录中。不下载也可以,sh脚本中自己会用wget下载,但是会等很多时间,比自己直接下载多出了很多很多的时间(具体多多少,自己试验一下就知道了,保证你试了后会很后悔,呵呵^_^)。
然后执行
-
./demo-arm9tdmi.sh
然后出去逛逛街、拿本书看看,睡会觉听会音乐或打开一个电影看看什么都可以,
这个过程要有很长时间(在我的AMD64 2.8GCPU,1G内存SATA硬盘的台式机电脑上用了大约1个半小时的样子),足够干以上列出来的事了。
编译完成后,有目录 /home/lpsc/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/ 目录比较长,后来分析了一下all.sh脚本,发现可以通过设置PREFIX值来减少结果路径长度,不过编译一遍需要那么长的时间,就没有实际试验。
最后在~/.bashrc文件的最后加入:
-
export PATH=$PATH:/home/lpsc/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin
这样新打开的终端就可以使用 arm-linux-gcc 等命令了。
这儿有编译好的gcc-3.4.1和gcc-3.3.2版本的下载
这儿有几个更旧一点的包(有经典的2.95.3版本)
下载下来后使用
-
tar -xjvf arm-linux-gcc-3.3.2.tar.bz2 -C /
-
tar -xjvf arm-linux-gcc-3.4.1.tar.bz2 -C /
将交叉工具链释放到/usr/local/arm目录下。
再在~/.bashrc文件的最后加入
-
export PATH=$PATH:/usr/local/arm/3.4.1/bin
Popularity: 4% [?]
Related
在Linux下安装运行Eclipse
到www.sun.com公司下载最新版本的jdk1.6.0安装
-
chmod +x jdk-6u10-beta-linux-i586-rpm.bin
-
./jdk-6u10-beta-linux-i586-rpm.bin
-
rpm -ivh jdk-6u10-beta-linux-i586.rpm
到www.eclipse.org下载最新的eclipse程序解压安装.
-
tar -xzvf eclipse-java-ganymede-linux-gtk.tar.gz
-
mv eclispse /usr
修改 /etc/profile 在后面添加
-
export JAVA_HOME=/usr/java/jdk1.6.0_10
-
export CLASSPATH=/usr/java/jdk1.6.0_10/lib
编辑一个运行eclispe的命令到/usr/local/bin/runeclipse
-
touch /usr/local/bin/runeclipse
-
chmod +x /usr/local/bin/runeclipse
-
vi /usr/local/bin/runeclipse
输入一下内容
-
/usr/local/eclipse/eclipse -vm /usr/java/jdk1.6.0_10/bin/java &
在控制台输入
-
runeclipse
出现eclipse启动界面,进入创建一个文件试验了一下,运行正常。
Popularity: 4% [?]
Related
为Linux系统升级SSH(安装配置OpenSSH 5.0p1)
在升级了openssl后,我们还要升级一下SSH
1. 首先将原有的ssh停止卸载掉
-
service sshd stop
-
rpm –e openssh –nodeps
-
rpm –e openssh-server –nodeps
-
rpm –e openssh-askpass-gnome
-
rpm –e openssh-askpass
2. 然后通过
-
wget ftp://ftp.jp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-5.0p1.tar.gz
下载最新的openssh源码包。
3. 对源码包进行编译安装
-
tar -xzvf openssh-5.0p1.tar.gz
-
cd openssh-5.0p1
-
./configure –prefix=/usr –sysconfdir=/etc/ssh –with-pam –with-ssl-dir=/usr/local/ssl –with-md5-passwords –mandir=/usr/share/man
-
make
-
make install
4.通过 ssh -ver 查看安装的版本号,验证安装结果
5.启动服务看服务的运行情况
-
service sshd start
-
netstat -na |grep :22
6.使用ssh客户端登陆验证服务运行情况(本地登陆验证).
-
ssh 127.0.0.1
注意:
这么升级完成以后,在开机启动后sshd并没有启动
而且原先可以使用的 #service sshd start / stop 方式也将不再可用。
为了能够开机启动sshd,我们可以有两种方法解决。
1.在做处理前(卸载原先的sshd rpm包之前)
先将 /etc/init.d/sshd 做个备份,
在升级好了以后,再将备份的sshd文件拷贝到/etc/init.d目录下,同时再执行
-
chkconfig –add sshd
-
chkconfig –level 123456 sshd on
这样开机后就可以自动启动sshd服务了,
同时也继续可以使用 serveice sshd start / stop 这样的方式管理sshd服务。
2.升级完成以后在 /etc/rc.local 文件中添加一句 /usr/sbin/sshd
这样,当机器启动后也可以自动启动ssh服务了
Popularity: 4% [?]