用shell脚本监控进程是否存在,不存在则启动的实例

用shell脚本监控进程是否存在,不存在则启动的实例:

vim socks-forward.sh
#!/bin/sh
ps -fe|grep 'process name' |grep -v grep
if [ $? -ne 0 ]
then
echo "start....."
#do same thing
echo "done....."
else
echo "runing....."
fi

设置定时任务:

*/10 * * * * sh /disk/server/socks-forward.sh

10条命令分析Linux性能问题

当你登录到一台存在性能问题的Linux服务器上时,在头一分钟,你会检查什么?

我们看看Netflix的性能工程师是怎么做的。

Netflix大量使用EC2 Linux服务器,很多时候是用一些较为高层的工具做云或实例层次的分析。不过有时仍然需要登录到某个实例上,运行一些标准的Linux性能工具。

在最开始的一分钟内,可以先利用手头的标准Linux工具大致了解性能状况。借助如下10条命令(有些命令需要安装sysstat包),了解系统资源使用状况和正在运行的进程。先检查错误(errors)和饱和度(saturation),再检查资源利用率(resource

阅读全文

linux根据字符串长度排序

sort 命令可以按照字母或者数字顺序排列字符串,不过如果我们想根据字符串的长度来排序呢?

配合一点点 awk 魔法,就可以达成愿望。建立一个 lsort 文件,内容如下:

#! /bin/sh awk ‘BEGIN { FS=RS } { print length, $0}’ $* | sort +0n -1 | sed ‘s/^[0-9][0-9]* //’

首先,awk 把标准输入中每行的前面,都加上这行的长度,然后传给 sort 对长度数字进行排序,最后用 sed 把长度数字删掉。

保存之后,加上可执行标记,就可以拷贝到

阅读全文

Linux比较文本文件的交集、差集与求差

介绍两个常用命令:

1. comm命令

comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。有三列内容:分别表示A-B,B-A 和 A交B。

相关集合论解释: 交集:打印出两个文件所共有的行。 求差:打印出指定文件所包含的且不相同的行。<br

阅读全文

Linux内存中的Cache真的能被回收么?

在Linux系统中,我们经常用free命令来查看系统内存的使用状态。在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态:

[root@tencent64 ~]# free
             total       used       free     shared    buffers     cached
Mem:     132256952   72571772   59685180          0    1762632   53034704
-/+ buffers/cache:   17774436  114482516
Swap:      2101192        508    2100684

这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次:

  1. 不了解。这样的人的第一反应是:天啊,内存用了好多,70个多G,可是我几乎没有运行什么大程序啊?为什么会这样?Linux好占内存!
  2. 自以为很了解。这样的人一般评估过会说:嗯,根据我专业的眼光看的出来,内存才用了17G左右,还有很多剩余内存可用。buffers/cache占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的。
  3. 真的很了解。这种人的反应反而让人感觉最不懂Linux,他们的反应是:free显示的是这样,好吧我知道了。神马?你问我这些内存够不够,我当然不知道啦!我特么怎么知道你程序怎么写的?

根据目前网络上技术文档的内容,我相信绝大多数了解一点Linux的人应该处在第二种层次。大家普遍认为,buffers和cached所占用的内存空间是可以在内存压力较大的时候被释放当做空闲空间用的。但真的是这样么?在论证这个题目之前,我们先简要介绍一下buffers和cached是什么意思:

什么是buffer/cache?

buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。

什么是page cache

Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

什么是buffer cache

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

如何回收cache?

Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。

但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。

在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches 
1

方法是:

echo 1 > /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。

echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。

echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。

cache都能被回收么?

我们分析了cache能被回收的情况,那么有没有不能被回收的cache呢?当然有。我们先来看第一种情况:

tmpfs

大家知道Linux提供一种“临时”文件系统叫做tmpfs,它可以将内存的一部分空间拿来当做文件系统使用,使内存空间可以当做目录文件来用。现在绝大多数Linux系统都有一个叫做/dev/shm的tmpfs目录,就是这样一种存在。当然,我们也可以手工创建一个自己的tmpfs,方法如下:

[root@tencent64 ~]# mkdir /tmp/tmpfs [root@tencent64

阅读全文

查看Linux某端口被哪个进程占用

例如:

nginx: [emerg] bind() to 0.0.0.0:8004 failed (98: Address already in use) 1.查看占用8004端口的进程ID:
$ netstat -anp |grep 8004
tcp  0  0 0.0.0.0:8004  0.0.0.0:*  LISTEN  2768/nginx.conf
2.查看进程信息:
$ ps -u -p 2768
USER  PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND

work 2768  0.0  0.5 385344 353712 ?     Ss   Mar28   0:00 nginx: master process /home/work/odp/nginx/sbin/nginx -p/home/work/odp/nginx -c /home/

3.根据实际情况修改端口或停止原进程

避免误删,自己搭建linux回收站

相信不少人都遇到过误删了在Linux虚拟机中写的程序文件,使忙活了半天的工作功亏一篑。其实可以通过alias rm为mv动作来解决误删问题。具体如下。

1、编写回收站脚本 vim /bin/rm.sh #!/bin/sh dirpath=/data/Recycle # 选择回收站所在的分区目录 now=`date +%Y%m%d_%H_%M_%S_` filename=${now}$1 # 给已经删除的文件加一个时间前缀来标识删除时的精准时间 if [ ! -d ${dirpath} ];then /bin/mkdir -p ${dirpath} fi /bin/mv $1 ${dirpath}/${filename}

2、设置alias rm
chmod 755 /bin/rm.sh
echo “alias rm=’/bin/rm.sh'” >> /etc/bashrc

3、删除文件测试 rm /root/text.txt 此时,text.txt文件就会被mv 到 回收站目录

阅读全文

Linux History记录添加时间戳

熟悉bash的都一定知道使用history可以输出你曾经输入过的历史命令,例如 :
[root@YAN ~]# history | more
6 ./test.sh
7 vim test.sh
8 ./test.sh
但是这里只显示了命令,并没有显示执行命令的时间,因为保存历史命令的~/.bash_history里并没有保存时间。

通过设置环境变量 export HISTTIMEFORMAT=”`whoami` %F %T ” 给history加上时间戳

[root@YAN ~]# export HISTTIMEFORMAT=”`whoami` %F %T ” [root@YAN ~]# history

阅读全文

samba的安装与使用

samba主要用于linux向window共享文件,本文讲解如何在linux中安装、配置并在windows挂载。

1.centos安装samba

yum install samba samba-client samba-swat
rpm -qa |grep samba        #查看安装状况
/etc/init.d/smb restart     #启动Samba服务器
service smb status         #查看samba的服务启动情况
chkconfig --level 35 smb on   #设置开机自启动

2.centos配置samba

vim /etc/samba/smb.conf [global] workgroup = WORKGROUP unix charset = cp936 max log

阅读全文

linux lsof命令详解

简介

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

输出信息含义

在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

直接输入lsof部分输出为:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root rtd DIR 8,1 4096 2 / init 1 root txt REG 8,1 150584 654127 /sbin/init udevd 415 root 0u CHR

阅读全文

df磁盘满了但是du未满时的处理

现象:
df看硬盘满了,但是du实际文件没占满。
$ df -h
/dev/sda6 1.3T 1.3T 0 100% /home
$ du -sh /home/
371G /home/

原因:
有些文件被删了,但是文件句柄还没有释放(进程占用), 所以导致文件的空间没有清理出来,需要把进程杀了。
以下命令会列出这些文件和进程:
lsof |grep delete

Mac添加Bash Shell Alias

Alias是linux中常用的别名命令,这么好的东东在mac中自然不会舍去。当有一些比较复杂的命令需要经常执行的时候,alias对效率的提升立竿见影。

示例:

ubuntu 里面有命令“ll”,直接代替了“ls -l”命令,使用起来非常方便,但是Mac Book Pro系统默认没有“ll”命令,于是需要自己用别名(alias)来重设。

alias 别名步骤如下:

1) sudo vim  /etc/profile(打开/etc/profile文件,并设为可写权限,并用管理员sudo权限修改)

2)alias ll=’ls -l’ (重置别名)

阅读全文

linux下将远程磁盘mount到本地

实现办法: 使用nfs服务,在客户端mount服务器的文件夹。 操作步骤: 1.在服务器端启动nfs和portmap服务。 service nfs start service portmap start 运行ntsysv,把nfs和portmap加入到启动服务中去 2.在服务器编辑配置文件/etc/exports 如果你需要共享/data目录给10.10.10.10这个ip,可以加上如下的配置语句: /data   10.10.10.10(rw,no_root_squash) 3.重启服务器端的nfs服务 service nfs restart 4.在客户端启动portmap服务 service portmap start 5.在客户端mount远程文件夹 mkdir /data mount -t nfs 10.10.10.1:/data /data 或者 vi /etc/fstab 10.10.10.1:/data/data     /data/data nfs     defaults        0 0

linux的expect用法

1. [#!/usr/bin/expect]

这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。

注意:这一行需要在脚本的第一行。

2. [set timeout 30]

基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒   。timeout -1 为永不超时

阅读全文

linux通过ssh-keygen实现无密码scp文件和目录

1
在编写Shell脚本远程拷贝的时候,脚本在执行过程中因为要检验密码会被打断,这时可以通过ssh-keygen实现两台linux主机之间的指定用户免密码登陆。

整个过程如下:

本地服务器:A
远程服务器:B

1.在 A 上运行 ssh-keygen -t rsa 在/home/openpf/.ssh下生成id_rsa 和 id_rsa.pub 两个文件,然后在/home/openpf/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A,以便拷贝到服务器B,如图所示:

2. 在 B 上也同样运行 ssh-keygen -t rsa 3. 在 B 的/home/openpf/.ssh下创建authorized_keys文件,把A

阅读全文

linux之sed用法

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法

sed命令行格式为:
sed [-nefri] ‘command’ 输入文本

常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e∶直接在指令列模式上进行 sed 的动作编辑; -f∶直接将

阅读全文