Skip to content

{ Category Archives } LINUX

日志检查工具——Logcheck

  Logcheck (主页)是用来自动检查系统安全入侵事件和非正常活动记录的工具,它分析各种Linux下的日志文件,比如 /var/log/messages、/var/log/secure、/var/log/maillog 等等,生成一个可能有安全问题的问题报告,并自 动发送电子邮件给管理员。能设置它基于每小时或者每天用crond来自动运行。 Logcheck是一个软件包,用来实现自动检查日志文件,以发现安全入侵和不正常的活动。Logcheck用logtail程序来记录读到的日志文件的位置,下一次运行的时候从记录下的位置开始处理新的信息。所有的源代码都是公开的,实现方法也非常简单。 Logcheck SHELL脚本和logtail.c程序用关键字查找的方法进行日志检测。在这儿提到的关键字就是指在日志文件中出现的关键字,会触发向系统管理员发的报 警信息。Logcheck的配置文件自带了缺省的关键字,适用于大多数的Unix系统。但是最好还是自己检查一下配置文件,看看自带的关键字是否符合自己 的需要。 Logcheck脚本是简单的SHELL程序,logtail.c程序只调用了标准的ANSI C函数。Logcheck要在cron守护进程中配置,至少要每小时运行一次。脚本用简单的grep命令来从日志文件检查不正常的活动,如果发现了就发送 电子邮件给管理员。如果没有发现异常活动,就不会收到电子邮件。 logcheck工具的主页在 http://logcheck.org/,用户可以在上面下载其最新版本: logcheck-1.1.1.tar.gz。下载后用tar xvfz logcheck-1.1.1.tar.gz命令解开到一临时目录下,然后用make linux自动生成相应的文件到/usr/local/etc、/usr/local/bin/等目录下。用户可能需要更改设置,如发送通知到谁的邮件账 号等,默认发送到root。 利用logcheck工具分析所有logfile,避免每天经常手动地检查它们,节省了时间,提高了效率。

关于sizeof()的简单解析

在所有说明之前,先给出一道题目: int a=256; printf(“%d\n”, sizeof(++a)); printf(“%d\n”, a); 那么到底打印的是多少呢? 应该是4和256,第一个答案大家应该已经没有问题了,但是为什么在++a以后,a的数值还是没有发生变化呢?因为sizeof()是一个运算符,在其中的所有的运算都是无效的,所以++a根本就没有运行。 上面的一个例子提醒我们,虽然sizeof看这简单,但是其中还是有很多的问题值得讨论的: 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法  1、用于数据类型  sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。 2、用于变量  sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。 三、sizeof的结果  sizeof操作符的结果类型是size_t,它在头文件 <stddef.h> 中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 1、若操作数具有类型char、unsigned char或signed char,其结果等于1。 ANSI C正式规定字符类型为1字节。 2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、 2、 4、4、4、8、10。 3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 4、当操作数具有数组类型时,其结果是数组的总字节数。 5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。 让我们看如下结构: struct {char b; double x;} a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。 6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 四、sizeof与其他操作符的关系  sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。 五、sizeof的主要用途  1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: void *malloc(size_t size), size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 2、sizeof的另一个的主要用途是计算数组中元素的个数。例如: void * memset(void * s,int c,sizeof(s))。 六、建议  由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

不常用的Linux进程信息

        ps能够提供不少进程信息,比如进程号、进程运行状态、进程名称、所占CPU时间、所占内存等。除此以外,还有一些不很常用的进程信息,可以用来解决一些 可能很常见的问题 (比如内存泄漏,进程运行异常等)。 所打开的文件 获取方法1: # ls -l /proc/$PID/fd/ 获取方法2: # lsof -p $PID 内存分配表 获取方法: # lcat /proc/$PID/maps 堆栈 获取方法: # pstack $PID 所发出的系统调用 获取方法: # strace -p $PID 所发出的库函数调用 获取方法: # ltrace -p $PID 进程继承关系 获取方法: ps -eo user,pid,ppid,%cpu,%mem,vsz,rss,tty,stat,start,time,wchan,command –forest 运行时dumpcore 获取方法: # gcore $PID

转:Linux服务器整体性能监控

Linux服务器性能监测是很重要的工作,服务器运行应该提供最有效的系统性能。当服务器系统性能突然低于平均应有的情况,问题可能来自在执行的进程、内存的使用率、磁盘的性能、网络流量和CPU 的压力。在预算短缺的今天,理解如何优化系统性能比以往任何时候都重要。要实现它的前提是,你必须充分了解自己的计算机和网络,从而找到真正的瓶颈所在。本文提供一些基础的工具来辨别和处理一些性能问题。使用的Linux 发行版本是Red Hat Enterprise Linux 4,工作过程是:首先查看整个系统的状态,然后是检查特定的子系统。Linux服务器进行性能监控有几种方法,每种方法都各有其优缺点。  使用SNMP等标准工具 标准及非标准工具能执行一个或多个收集、合并及传输阶段,如rstatd或SNMP工具,然而标准的rstat后台程序提供的信息是有限的,速度慢而且效率低。  内核模块 几个系统监控工程利用内核模块来存取监控数据。一般情况下,这是很有效的收集系统数据的方法。然而这种方法存在的问题是,当主内核源内有其它改变时,必须保持代码一致性。一个内核模块可能与用户想使用的其它内核模块相冲突。此外,在使用监控系统之前,用户必须获得或申请模块。  /proc虚拟文件系统 /proc虚拟文件系统是一个较快的、高效率执行系统监控的方法。使用/proc的主要缺点是必须保持代码分析与/proc 文件格式改变的同步。事实表明,Linux内核的改变比/proc 文件格式的改变要更频繁,所以,用/proc虚拟文件系统比用内核模块存在的问题要少。本文介绍的方法即基于/proc虚拟文件系统。 一、 /proc文件系统特点 Linux 系统向管理员提供了非常好的方法,使他们可以在系统运行时更改内核,而不需要重新引导内核系统。这是通过 /proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。不用重新启动而去看 CMOS ,就可以知道系统信息。这就是 /proc 的妙处之一。 小提示: 每个Linux系统根据软硬件不同/proc 虚拟文件系统的内容也有些差异。/proc 虚拟文件系统有三个很重要的目录:net,scsi和sys。Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。 二、 系统负载监测 1 使用uptime命令 使用uptime命令可以查看系统负载,系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数目。如果一个进程满足以下条件则其就会位于运行队列中:没有在等待I/O操作的结果、它没有主动进入等待状态(也就是没有被调用、没有被停止。 # uptime 9:51pm up 3 days, 4:43, 4 [...]

模拟 Linux 密码输入

模拟 Linux 密码输入,回显 ‘*’ ,支持退格删除,Code in C,Only use in Linux: #include #include #define passLength 100 int main(int argc, char **argv) { struct termio tio, tin; char*password =(char*)malloc(passLength); char*b=password; ioctl(0, TCGETA, &tio); tin = tio; tin.c_lflag &= ~ECHO; /* turn off ECHO */ tin.c_lflag &= ~ICANON; /* turn off ICANON */ tin.c_lflag &= ~ISIG; tin.c_cc[VINTR]=1; tin.c_cc[VMIN]=1; [...]

find 命令用法

find / -name access_log 2>/dev/null find /etc -name ‘*srm*’ find / -amin -10 # 查找在系统中最后10分钟访问的文件 find / -atime -2 # 查找在系统中最后48小时访问的文件 find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 find / -mtime -1 #查找在系统中最后24小时里修改过的文件 find / -cmin -5 # 查找在系统中最后5分钟里被改变状态的文件 find / -ctime -1 #查找在系统中最后24小时里被改变状态的文件 find / -user reda #查找在系统中属于fred这个用户的文件 find / -not -user reda #查找在系统中不属于FRED这个用户的文件 find [...]

针对Web服务器总体优化

毕业论文《高并发高流量网站架构》后续关注 一、文件系统 在fstab里加入noatime,如 #cat /etc/fstab /dev/sda1          /home                  ext3    noatime,defaults        1 2 reboot或者重新mount生效 二、Tcp优化 在/etc/sysctl.conf里加入 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 3 net.ipv4.tcp_syncookies = 1 #启用syncookies net.ipv4.tcp_max_syn_backlog = 8192 #定义backlog队列容纳的最大半连接数 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = [...]

BASH 技巧

原创,转载请著名出处:http://www.fulin.org/blog/ ####### 程序guard,保证只有一个程序实例运行 ######## WORK_DIR=$(dirname $0) PROG_NAME=$(basename $0) ps -ef|grep -v “grep”|grep -c “sh ./$PROG_NAME” > $WORK_DIR/$$.tmp daemon_guard=$(cat $WORK_DIR/$$.tmp) rm -rf $WORK_DIR/$$.tmp if [ $daemon_guard -eq 0 ];then echo “daemon_guard match invalid , please check progrem !” >&2 exit 2 fi if [ $daemon_guard -gt 1 ];then echo “already run a ./$PROG_NAME instance, this process [...]

Linux日志文件系统及性能分析

日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了 Linux常用的日志文件系统:EXT3、ReiserFS、XFS和JFS日志技术,并采用标准的测试工具PostMark和 Bonnie++对它们进行了测试,给出了详细的性能分析,对Linux服务器应用具有重要的参考价值。 一、概述 所谓日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录,它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在磁盘分区中保存有日志记录,写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作。在日志文件系统中,所有的文件系统的变化都被记录到日志,每隔一定时间,文件系统会将更新后的元数据及文件内容写入磁盘。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,然后它修改元数据。目前Linux的日志文件系统主要有:在Ext2 基础上开发的Ext3,根据面向对象思想设计的ReiserFS,由SGI IRIX系统移植过来的XFS,由IBM AIX系统移植过来的JFS,其中EXT3完全兼容EXT2,其磁盘结构和EXT2完全一样,只是加入日志技术;而后三种文件系统广泛使用了B树以提高文件系统的效率。 二、Ext3 Ext3 文件系统是直接从Ext2文件系统发展而来,目前Ext3文件系统已经非常稳定可靠,它完全兼容Ext2文件系统,用户可以平滑地过渡到一个日志功能健全的文件系统。Ext3日志文件系统的思想就是对文件系统进行的任何高级修改都分两步进行。首先,把待写块的一个副本存放在日志中;其次,当发往日志的 I/O 数据传送完成时(即数据提交到日志),块就写入文件系统。当发往文件系统的I/O 数据传送终止时(即数据提交给文件系统),日志中的块副本就被丢弃。 2.1 Ext3日志模式 Ext3既可以只对元数据做日志,也可以同时对文件数据块做日志。具体来说,Ext3提供以下三种日志模式: 日志(Journal ) 文件系统所有数据和元数据的改变都记入日志。这种模式减少了丢失每个文件所作修改的机会,但是它需要很多额外的磁盘访问。例如,当一个新文件被创建时,它的所有数据块都必须复制一份作为日志记录。这是最安全和最慢的Ext3日志模式。 预定(Ordered ) 只有对文件系统元数据的改变才记入日志。然而,Ext3文件系统把元数据和相关的数据块进行分组,以便把元数据写入磁盘之前写入数据块。这样,就可以减少文件内数据损坏的机会;例如,确保增大文件的任何写访问都完全受日志的保护。这是缺省的Ext3 日志模式。 写回(Writeback ) 只有对文件系统元数据的改变才记入日志;这是在其他日志文件系统发现的方法,也是最快的模式。 2.2 日志块设备(JBD) Ext3 文件系统本身不处理日志,而是利用日志块设备(Journaling Block Device)或叫JBD 的通用内核层。Ext3文件系统调用JDB例程以确保在系统万一出现故障时它的后续操作不会损坏磁盘数据结构。Ext3 与JDB 之间的交互本质上基于三个基本单元:日志记录,原子操作和事务。 日志记录本质上是文件系统将要发出的低级操作的描述。在某些日志文件系统中,日志记录只包括操作所修改的字节范围及字节在文件系统中的起始位置。然而,JDB 层使用的日志记录由低级操作所修改的整个缓冲区组成。这种方式可能浪费很多日志空间(例如,当低级操作仅仅改变位图的一个位时),但是,它还是相当快的,因为JBD 层直接对缓冲区和缓冲区首部进行操作。 修改文件系统的任一系统调用都通常划分为操纵磁盘数据结构的一系列低级操作。如果这些低级操作还没有全部完成系统就意外宕机,就会损坏磁盘数据。为了防止数据损坏,Ext3文件系统必须确保每个系统调用以原子的方式进行处理。原子操作是对磁盘数据结构的一组低级操作,这组低级操作对应一个单独的高级操作。 出于效率的原因,JBD 层对日志的处理采用分组的方法,即把属于几个原子操作处理的日志记录分组放在一个单独的事务中。此外,与一个处理相关的所有日志记录都必须包含在同一个事务中。一个事务的所有日志记录都存放在日志的连续块中。JBD层把每个事务作为整体来处理。例如,只有当包含在一个事务的日志记录中的所有数据提交给文件系统时才回收该事务所使用的块。 三、ReiserFS ReiserFS 是一个非常优秀的文件系统,其开发者非常有魄力,整个文件系统完全是从头设计的。目前,ReiserFS可轻松管理上百G的文件系统,这在企业级应用中非常重要。ReiserFS 是根据面向对象的思想设计的,由语义层(semantic layer)和存储层(storage layer)组成。语义层主要是对对象命名空间的管理及对象接口的定义,以确定对象的功能。存储层主要是对磁盘空间的管理。语义层与存储层是通过键(key)联系的。语义层通过对对象名进行解析生成键,存储层通过键找到对象在磁盘上存储空间,键值是全局唯一的。 3.1 语义层主要接口 1) 文件接口 每个文件拥有一个接口ID,此ID标识一个方法集,此方法集包含访问ReiserFS 文件的所有接口。 2) [...]

转:Memcached深度分析

Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内 存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得 对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一步的优化。末了将通过对BSM_Memcache扩展的分析,加深对 memcached的使用方式理解。 本文的部分内容可能需要比较好的数学基础作为辅助。 ◎Memcached是什么 在 阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached使用了同 样的“Key=>Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的,也就是说它不是本 地的。它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。 Memcached 使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接的,所以它实际的并 发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。关于 libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有 关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。 ◎Memcached适合什么场合 在很多时候,memcached都被滥用了,这当然少不了对它的抱怨。我经常在论坛上看见有人发贴,类似于“如何提高效率”,回复是“用memcached”,至于怎么用,用在哪里,用来干什么一句没有。memcached不是万能的,它也不是适用在所有场合。 Memcached 是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来 任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是 本地级缓存,使用memcached是非常不划算的。 Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库 少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁 的,memcached可以大大降低数据库压力,使系统执行效率提升。另外,memcached也经常作为服务器之间数据共享的存储媒介,例如在SSO系 统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。 需要注意的是,memcached使用内存管理数 据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以memcached不能用来持久保存数据。很多人的错误理解, memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络 连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出 现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。 ◎Memcached的工作方式 以下的部分中,读者最好能准备一份memcached的源代码。 Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行。创建守护进程由daemon.c完成,这个程序只有一个daemon函数,这个函数很简单(如无特殊说明,代码以1.2.1为准): 引用 #include #include #include int daemon(nochdir, noclose) int nochdir, noclose; { int fd; switch (fork()) { case -1: return (-1); [...]