Skip to content Skip to main navigation Skip to footer

Linux

CentOS如何设置远程桌面以及自动登录

很多人都知道如何配置windows下的远程桌面以及如何从一台windows机器登陆到另一台windows机器,那么在CentOS下是否也有类似的功能呢,答案是肯定的。本文将会告诉大家怎么在CentOS 图形界面下去配置远程桌面。

 启用远程桌面

当你安装CentOS系统的时候,务必要安装Gnome桌面环境,然后在菜单栏里找到“Remote Desktop”,之后系统会弹出”Remote Desktop Preferences” 窗口,选中“Allow other users to view your desktop”和 "Allow other users to control your desktop”.
remote dektop
remote dektop2

配置远程桌面自动登录

在CentOS系统里需要配置GDM(GNOME Display Manager), 通过vim 命令编辑gdm的配置文件/etc/custom.confi.
配置如下:
[cc lang=”php”] [daemon] GtkModulesList=gail:atk-bridge:/usr/lib/gtk-2.0/modules/libkeymouselistener:/usr/lib/gtk-2.0/modules/libdwellmouselistener
AddGtkModules=true
AutomaticLoginEnable=true
AutomaticLogin=loginusername  //设置你要自动登录的用户名
TimedLoginEnable=true
TimedLogin=loginusername     //设置你要自动登录的用户名
TimedLoginDelay=7
[/code]  
搞定。。。

Centos7搭建VPN服务器

遇到好多人说搭建VPN服务器出错的,今天正好搞了个Centos7的服务器,搭建了个VPN耍耍。那我们如何来在CentOS 7 系统下搭建VPN服务器呢?
1.先看看你的主机是否支持pptp,返回结果为yes就表示通过。
[cc lang=”php”] modprobe ppp-compress-18 && echo yes
[/code] 2 .是否开启了TUN,有的虚拟机主机需要开启,返回结果为cat: /dev/net/tun: File descriptor in bad state。就表示通过。
[cc lang=”php”]linux1u
cat /dev/net/tun
[/code] 3.安装ppp , pptpd 和 iptables。
a.先更新一下再安装。
[cc lang=”php”] yum update
[/code] b.安装ppp和pptpd
[cc lang=”php”] yum -y install ppp pptpd
[/code] c.安装iptables。
这是自带的,如果没有的话就安装。
[cc lang=”php”] yum install iptables
[/code] 4.配置pptpd.conf
[cc lang=”php”] vi /etc/pptpd.conf    #找到localip,去掉开始的那个#符号
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
#这些是默认的,一般不需要去修改,分配给客户端的ip就是234到238之间,你也可以往大了写,看你的客户端有多少。
[/code]  5.配置options.pptpd
[cc lang=”php”] vi /etc/ppp/options.pptpd      #在末尾添加dns
ms-dns  8.8.8.8       #这是谷歌的,你也可以改成阿里巴巴的或者其它
ms-dns  8.8.4.4
[/code] 6.配置连接VPN客户端要用到的帐号密码。
[cc lang=”php”] vi /etc/ppp/chap-secrets    #格式很通俗易懂。
#   client为帐号,server是pptpd服务,secret是密码,*表示是分配任意的ip
# Secrets for authentication using CHAP
# client        server     secret                  IP addresses
count         pptpd    771297972            *
[/code]    7.配置sysctl.conf
[cc lang=”php”] vi /etc/sysctl.conf
#添加一行    net.ipv4.ip_forward = 1    到末尾即可,然后保存
sysctl -p    #运行这个命令会输出上面添加的那一行信息,意思是使内核修改生效
[/code]  8.这个时候把iptables关闭的话是可以连接VPN了,之所以要把iptables关闭是因为没有开放VPN的端口,客户如果直接连接的话是不允许的。这里还需要设置iptables的转发规则,让你的客户端连接上之后能访问外网。
[cc lang=”php”] iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.0.234/24 -j SNAT –to 你的服务器的公网IP
#192.168.0.234/24是你分配给客户的ip,后面的那个是你的服务器的公网IP
[/code]   9.这个时候还是连接不上的,因为iptables把客户的VPN连接拦截了,不允许连接,所以得开放相应的端口。
具体是哪个端口可以自己查下,我的是默认的,如果你没有更改过的话也会是默认的。
[cc lang=”php”] iptables -I INPUT -p tcp –dport 1723 -j ACCEPT
iptables -I INPUT -p tcp –dport 47 -j ACCEPT
iptables -I INPUT -p gre -j ACCEPT
[/code] 10.保险起见,到了这里应该重启一下pptpd服务和iptables服务生效。
[cc lang=”php”] systemctl restart iptables
systemctl restart pptpd
[/code]   11.VPN服务器搭建完成。
原文地址:http://my.oschina.net/110NotFound/blog/338080

CentOS下如何使用Uptime 命令

对于一些人来说系统运行了多久是无关紧要的,但是对于服务器管理员来说,这是相当重要的信息。服务器在运行重要应用的时候,必须尽量保证长时间的稳定运行,有时候甚至要求零宕机。那么我们怎么才能知道服务器运行了多久呢?
03055445R-0在Linux 下,我们可以使用uptime 命令,而且此命令不必使用root 权限。uptime 命令在系统中已经默认安装了
语法如下:

$ uptime

你会在屏幕上看到如下显示:

图一
图一
这些信息保存在/proc/uptime 文件中,虽然是以文本方式保存,但是这些数据却不能直接显示,这就需要我们使用uptime 命令来翻译它。
以下是如何解读uptime 提供的信息:

系统时间

在图1中,左起第一条信息是14:04:39,这就是当前系统时间,以24小时格式输出。

系统运行时间

第二条信息Up 1004 days, 12:20,这是显示你的系统运行时间。图1 显示你的系统已经运行了1004天12小时20分钟,如果你的系统没有运行超过24小时,这里将只会显示小时分钟或者只显示分钟。注意图2、图3的信息,当系统重启后将会清零。
0305543024-3
0305544025-2
 

已登录用户的数量

第三部分的信息是显示已登陆用户的数量。在图1中,显示的是1 user ,即当前登录用户数量。当多个用户在同时登陆系统时,uptime 命令将告诉你用户的数量。

平均负载量

最后一个信息是系统的平均负载量。回到图1,你看到这样带两位小数的数字0.25, 0.25, 0.19可以换算成百分比,即0.25和0.19分别代表着25%和19%。0.25, 0.25, 0.19分别代表着过去1分钟、5分钟、15分钟系统的平均负载量。负载量越低意味着你的系统性能越好。
这就是uptime 命令的日常使用指导,如果想获取更详细的信息,请通过输入man uptime 进入uptime 命令的manual 页面来查看。
你的机器已经运行多久了?贴出你的uptime给大家看看吧。
来源:linux.cn(linux中国)
via: http://linoxide.com/linux-command/linux-uptime-command/

Linux:如何配置无密码登陆

ssh今天需要配置两台主机的无密码登陆,按照以前的经历,参照下面的步骤做配置,结果依旧有问题,有一台主机依旧无法ssh无密码登陆自己(ssh localhost), 查看了很多资料依旧无法,最后仔细的比对了两台机器的.ssh目录的权限设置,发现所属用户不是root,故而使用chown 命令更改。之后,两台机器无密码ssh成功。
ssh配置
主机A:10.0.5.199
主机B:10.0.5.198
需要配置主机A无密码登录主机A,主机B
先确保所有主机的防火墙处于关闭状态。
在主机A上执行如下:
1. $cd ~/.ssh
2. $ssh-keygen -t rsa  ——————–然后一直按回车键,就会按照默认的选项将生成的密钥保存在.ssh/id_rsa文件中。
3. $cp id_rsa.pub authorized_keys
这步完成后,正常情况下就可以无密码登录本机了,即ssh localhost,无需输入密码。
4. $scp authorized_keys summer@10.0.5.198:/home/summer/.ssh   ——把刚刚产生的authorized_keys文件拷一份到主机B上.
5. $chmod 600 authorized_keys
进入主机B的.ssh目录,改变authorized_keys文件的许可权限。
(4和5可以合成一步,执行:  $ssh-copy-id -i summer@10.0.5.198 )
正常情况下上面几步执行完成后,从主机A所在机器向主机A、主机B所在机器发起ssh连接,只有在第一次登录时需要输入密码,以后则不需要。
可能遇到的问题:
1.进行ssh登录时,出现:”Agent admitted failure to sign using the key“ .
执行: $ssh-add
强行将私钥 加进来。
2.如果无任何错误提示,可以输密码登录,但就是不能无密码登录,在被连接的主机上(如A向B发起ssh连接,则在B上)执行以下几步:

$chmod o-w ~/
$chmod 700 ~/.ssh
$chmod 600 ~/.ssh/authorized_keys
 

3.如果执行了第2步,还是不能无密码登录,再试试下面几个

$ps -Af | grep agent
 

检查ssh代理是否开启,如果有开启的话,kill掉该代理,然后执行下面,重新打开一个ssh代理,如果没有开启,直接执行下面:

$ssh-agent
 

还是不行的话,执行下面,重启一下ssh服务

$sudo service sshd restart
 

4. 执行ssh-add时提示“Could not open a connection to your authenticationh agent”而失败
执行: ssh-agent bash
总结:配置ssh无密码登陆的关键是权限的设置,.ssh权限是700,authorized_keys文件600,id_rsa 是600和id_rsa.pub是644.

Linux:如何杀掉僵尸进程(zombie process)

zombie今天程序在运行之后产生了好几个僵尸进程,网上找了很多方法,居然都没什么效果,最后不得不重启机器。下面是我使用过的几个杀僵死进程的方法,可能对某些进程管用,如果在使用的时候不管用,估计只能重启机器了。


1. 首先要查找系统中所有的僵尸进程

#先查看具体进程:
ps -A -o stat,ppid,pid,cmd |grep -e Zl
#杀死z进程(这些动作是比较危险的,希望在真正的服务器上面慎用
kill -9 pid号
 

如果僵尸进程不叫多,可以用下面的小脚本来批量处理:

#!/bin/bash
ps -A -o stat,ppid,pid,cmd | grep -e Zl | \
awk '{print $2}' | xargs kill -9
 

如果通过kill -9无法将僵尸进程杀掉的,哪么只能采用下面的方法,找到其父进程,将父进程杀掉。


2. 通过kill -18 杀掉僵尸进程的父进程
首先通过下面的命令查找到僵尸进程的父进程id:

#ps -A -o ppid,pid | grep -e Zl
 

然后通过kill -18 ppid将其杀掉
当然还有其他的方法来查看linux系统下的僵死进程:

# ps -ef | grep defunct | grep -v grep
 

使用Awk命令杀掉僵死进程:

#ps -ef | grep defunct | grep -v grep | awk '{print "kill -9" $2,$3}'
 

Linux:如何设置系统日期和时间

linux操作系统在linux系统里,如果想手动的更改系统的日期和时间,我们可以使用date命令。作为一个系统管理员,有时候需要同步整个集群的系统日期和时间,可以通过P配置NTP server来同步更新。下面几个命令来以不同的方式来更改系统的日期和时间。
1. 修改硬件时钟
(1)更新机器的硬件时间。命令为:hwclock –adjust
硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文件/etc/localtime指向它。
(2)查看硬件时钟。命令为:hwclock –show
(3)重置硬件时钟用:hwclock –set –date=mm/dd/yy hh:MM:ss”
2. 修改时区信息。命令为:tzset
如果系统中没有这条命令,那可以用类似下面的操作:
ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific
3. 选择时区信息。命令为:tzselect
根据系统提示,选择相应的时区信息。
4. 修改系统时钟。命令为:date -s
将系统时间设定成2014年07月18日:      date -s 2014/07/18
将系统时间设定成下午17点43分20秒:  date -s 17:43:20
该 命令是用来修改系统时钟的。在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时 间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在执行完 date -s 命令后,如果马上重起系统,修改的时间就有可能没有被写入CMOS。如果要确保修改生效,最好再使用 clock -w 这个命令将系统时间强行写入CMOS。

Linux/Suse 11:如何配置JAVA环境变量

Suse linux Suse下配置环境变量可能和Redhat不同,因为在Suse系统的root目录下或是用户目录下没有.bashrc 或者.bash_profile这样的文件,那么如何配置Java的环境变量呢或者如何永久配置PATH的环境变量值呢?
在Suse操作系统下,我们可以将要export的环境变量全部加到/etc/profile.local文件里,如果在/etc/目录下没有这个文件,那么可以手动创建一个,并将下面的内容输入到配置文件里:
JAVA_HOME=/mnt/Oracle/Middleware/jdk160_29/
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH PATH
之后保存退出,并退出当前shell, 重新进入后,你就会发现环境变量开始发挥作用了。

Linux/CentOS:如何安装CentOS 6.x操作系统(最详细的centos安装教程)

centosCentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本。每个版本的 CentOS都会获得十年的支持(通过安全更新方式)。新版本的 CentOS 大约每两年发行一次,而每个版本的 CentOS 会定期(大概每六个月)更新一次,以便支持新的硬件。这样,建立一个安全、低维护、稳定、高预测性、高重复性的 Linux 环境。[2] CentOS是Community Enterprise Operating System的缩写。

CentOS 是RHELRed Hat Enterprise Linux源代码再编译的产物,而且在RHEL的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。
CentOS在2014初,宣布加入Red Hat

下面我们分别介绍安装CentOS6.3,Centos 6.4和centos6.5三个版本的安装步骤:


安装CentOS6.3操作系统
首先要下载CentOS操作系统的ISO,下载地址点这里,目前最新版为5.3,下载文件有两种形式,一种是光盘CD版,要六张盘,要下载的文件为CentOS-5.3-i386-bin-1of6.iso
CentOS-5.3-i386-bin-2of6.iso
CentOS-5.3-i386-bin-3of6.iso
CentOS-5.3-i386-bin-4of6.iso
CentOS-5.3-i386-bin-5of6.iso
CentOS-5.3-i386-bin-6of6.iso.
另一种一种是DVD版,要一张盘,下载文件为CentOS-5.3-i386-bin-DVD.iso,3.7G容量。下载完成后,使用Nero等光盘刻录软件将ISO镜像文件转换、刻录成安装CD或DVD光盘。

然后将服务器硬盘格式化,插入CD或DVD的第一张盘启动,即可进入CentOS的安装程序。
CentOS操作系统安装教程
光盘启动,出现“boot:”提示符,直接按回车进入图形安装界面。出现是否对CD媒体进行测试的提问,这里选择“Skip”跳过测试。
CentOS操作系统安装教程
语言选择界面中,如需要使用中文系统,则选择简体中文进行安装。
CentOS操作系统安装教程
键盘选择为“美国英语式”。
CentOS操作系统安装教程
之后的分区设置中,如果硬盘没有其他系统,可以选择删除所有分区,如果还有Windows系统的话,可以选择删除Linux分区。
CentOS操作系统安装教程
接下来是网络配置,可以根据自己的实际情况来配置网络地址。
CentOS操作系统安装教程
时区设定,根据自己所在的时区选择相应的城市。
CentOS操作系统安装教程
接下来为root密码设置,因为root是系统管理员用户,因此要设置一个强密码,以防破解。
CentOS操作系统安装教程
在安装应用软件界面,因为我们要安装LAMP环境,因此要点“现在定制”。
CentOS操作系统安装教程
在“服务器”中,勾选“万维网服务器”。
CentOS操作系统安装教程
点“可选的软件包”,选择需要安装的模块,默认会安装Apache、MySQL和PHP等模块。
CentOS操作系统安装教程
之后,系统会提示你需要那几张安装光盘,准备好这些盘。
CentOS操作系统安装教程
接下来是安装过程,中途系统会提示换盘。
CentOS操作系统安装教程
安装完成后,会进入一个配置界面。
CentOS操作系统安装教程
在防火墙设置中,因为我们要架设网站,所以需要将HTTP端口打开。
CentOS操作系统安装教程
然后可以创建一个非管理使用的个人帐号。
CentOS操作系统安装教程
重启之后,就完成了安装,进入了CentOS的登录界面,输入登录用户root和root的密码进行登录。

安装CentOS6.4 操作系统
CentOS 6.4和之前的版本相比有了很大的改进,如下:

  •   增加微软Hyper-V驱动,在微软Hyper-V服务器上,CentOS作为虚拟机可以更加高效;
  •     samba4库升级至最新版本,完善了与Active Directory(AD)域名的交互。如果你从CentOS 6.3升级至CentOS 6.4,而且已经在使用Samba,那么首先要确保卸载samba4包,以避免在升级中造成冲突。
  •     弃用matahari。CentOS 6.4最新升级需要删除所有matahari,为确保已删除所有残留,在更新至6.4后请运行yum erase matahari*。
  •     i386架构新增了dev86、iasl和qemu-guest-agent。

首先我们需要下载CentosOS系统的ISO安装包,然后将其镜像到光盘里,制作成系统启动盘。
下载地址:
CentOS 6.4下载(网易镜像):http://mirrors.163.com/centos/6.4/isos/
官方下载页面:http://wiki.centos.org/Download
i386镜像:http://isoredirect.centos.org/centos/6/isos/i386/
x86-64镜像:http://isoredirect.centos.org/centos/6/isos/x86_64/
下面正式开始安装:
1.首先系统启动顺序设置为光盘启动,然后将光盘放入光驱,那么电脑启动的时候就会自动从光盘加载开始安装CentOS系统,安装界面如下:
界面说明:
centos 6.4安装教程
Install or upgrade an existing system 安装或升级现有的系统
install system with basic video driver 安装过程中采用基本的显卡驱动
Rescue installed system 进入系统修复模式
Boot from local drive   退出安装从硬盘启动
Memory test  内存检测
注:用联想E49安装时选择第一项安装时会出现屏幕显示异常的问题,后改用第二项安装时就没有出现问题
2、介质直接“skip”就可以了
centos 6.4安装教程
3、出现引导界面,点击“next”
centos 6.4安装教程
4、选中“English(English)”否则会有部分乱码问题
centos 6.4安装教程
5、键盘布局选择“U.S.English”
centos 6.4安装教程
6、选择“Basic Storage Devies”点击”Next”
centos 6.4安装教程
7、询问是否忽略所有数据,新电脑安装系统选择”Yes,discard any data”
centos 6.4安装教程
8、Hostname填写格式“英文名.姓”
centos 6.4安装教程
9、网络设置安装图示顺序点击就可以了
centos 6.4安装教程
10、时区可以在地图上点击,选择“shanghai”并取消System clock uses UTC前面的对勾
centos 6.4安装教程
11、设置root的密码
centos 6.4安装教程
12、硬盘分区,一定要按照图示点选
centos 6.4安装教程
13、调整分区,必须要有/home这个分区,如果没有这个分区,安装部分软件会出现不能安装的问题
centos 6.4安装教程
14、询问是否格式化分区
centos 6.4安装教程
15、将更改写入到硬盘
centos 6.4安装教程
16、引导程序安装位置
centos 6.4安装教程
17、最重要的一步,也是本教程最关机的一步,也是其他教程没有提及的一步,按图示顺序点击
centos 6.4安装教程
18、取消以下内容的所有选项
Applications
Base System
Servers
并对Desktops进行如下设置
即取消如下选项:
Desktop Debugging and Performance Tools
Desktop Platform
Remote Desktop Clients
Input Methods中仅保留ibus-pinyin-1.3.8-1.el6.x86_64,其他的全部取消
centos 6.4安装教程
centos 6.4安装教程
19、选中Languages,并选中右侧的Chinese Support然后点击红色区域
centos 6.4安装教程
20、调整完成后如下图所示
centos 6.4安装教程
21、至此,一个最精简的桌面环境就设置完成了,
centos 6.4安装教程
22、安装完成,重启
centos 6.4安装教程
23、重启之后,的License Information
centos 6.4安装教程
24、Create User
Username:填写您的英文名(不带.姓)
Full Name:填写您的英文名.姓(首字母大写)
centos 6.4安装教程
25、”Date and Time” 选中 “Synchronize data and time over the network”
Finsh之后系统将重启
centos 6.4安装教程
26、第一次登录,登录前不要做任何更改,这个很重要!!!登录之后紧接着退出
第二次登录,选择语言,在红色区域选择下拉小三角,选other,选中“汉语(中国)”
centos 6.4安装教程
centos 6.4安装教程
27、登录之后,请一定按照如下顺序点击!
至此,CentOS安装完成,如有其他问题,请随时与我联系!!
centos 6.4安装教程
安装CentOS 6.5操作系统
首先从官方下载CentOS 6.5版本的操作系统,然后刻录成CentOS系统启动盘。可以从下面的地址下载ISO文件:
32位:
http://mirror.centos.org/centos/6.5/isos/i386/CentOS-6.5-i386-bin-DVD1to2.torrent
64位:
http://mirror.centos.org/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1to2.torrent
其它的安装步骤和CentOS 6.3 /6.4的安装步骤类似。
 
 
 
 
 
 

Linux/Centos:如何快速的检测CPU的温度

cpu_temp于linux系统管理员,需要知道如何能更快速的来检测服务器中cpu的温度,那如何才能检测到cpu的温度信息呢?下面本文将会介绍一个工具叫lm_sensor来获取cpu的温度:
首先我们需要检测下lm_sensors这个软件包是否被安装。

[root@devops ~]# rpm -qa | grep lm_sensors  #通过查询,当前系统没有安装该工具
 

接下来我们就通过yum来安装:

[root@devops ~]# yum install lm_sensors
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/metalink                                            | 5.8 kB     00:00
* base: mirrors.btte.net
* epel: ftp.cuhk.edu.hk
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.btte.net
base                                                     | 3.7 kB     00:00
epel                                                     | 4.4 kB     00:00
epel/primary_db                                          | 6.2 MB     00:03
extras                                                   | 3.4 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.7 MB     00:01
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package lm_sensors.x86_64 0:3.1.1-17.el6 will be installed
--> Processing Dependency: lm_sensors-libs(x86-64) = 3.1.1-17.el6 for package:
lm_sensors-3.1.1-17.el6.x86_64
--> Processing Dependency: /usr/sbin/dmidecode for package: lm_sensors-3.1.1-17.el6.x86_64
--> Processing Dependency: libsensors.so.4()(64bit) for package: lm_sensors-3.1.1-17.el6.x86_64
--> Running transaction check
---> Package dmidecode.x86_64 1:2.12-5.el6_5 will be installed
---> Package lm_sensors-libs.x86_64 0:3.1.1-17.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================
Package               Arch         Version                 Repository     Size
=====================================================
Installing:
lm_sensors            x86_64       3.1.1-17.el6            base          123 k
Installing for dependencies:
dmidecode             x86_64       1:2.12-5.el6_5          updates        73 k
lm_sensors-libs       x86_64       3.1.1-17.el6            base           38 k
Transaction Summary
=====================================================
Install       3 Package(s)
Total download size: 235 k
Installed size: 605 k
Is this ok [y/N]:
...
Complete!
 

安装lm_sensors之后,我们需要使用sensors-detect命令来加载所有需要的内核模块,这样才能检测cpu的温度,输入下面的命令:

[root@devops ~]# sh -c "yes|sensors-detect"
# sensors-detect revision 1.1
# System: VMware, Inc. VMware Virtual Platform
# Board: Intel Corporation 440BX Desktop Reference Platform
This program will help you determine which kernel modules you need
to load to use lm_sensors most effectively. It is generally safe
and recommended to accept the default answers to all questions,
unless you know what you're doing.
Some south bridges, CPUs or memory controllers contain embedded sensors.
Do you want to scan for them? This is totally safe. (YES/no): Silicon Integrated Systems SIS5595...                       No
VIA VT82C686 Integrated Sensors...                          No
VIA VT8231 Integrated Sensors...                            No
AMD K8 thermal sensors...                                   No
AMD Family 11h thermal sensors...                           No
Intel digital thermal sensor...                             Success!
(driver `coretemp')
Intel AMB FB-DIMM thermal sensor...                         No
VIA C7 thermal and voltage sensors...                       No
Some Super I/O chips contain embedded sensors. We have to write to
standard I/O ports to probe them. This is usually safe.
Do you want to scan for Super I/O sensors? (YES/no): Probing for Super-I/O at 0x2e/0x2f
Trying family `National Semiconductor'...                   Yes
Found unknown chip with ID 0x0f00
Probing for Super-I/O at 0x4e/0x4f
Trying family `National Semiconductor'...                   No
Trying family `SMSC'...                                     No
Trying family `VIA/Winbond/Nuvoton/Fintek'...               No
Trying family `ITE'...                                      No
Some systems (mainly servers) implement IPMI, a set of common interfaces
through which system health data may be retrieved, amongst other things.
We first try to get the information from SMBIOS. If we don't find it
there, we have to read from arbitrary I/O ports to probe for such
interfaces. This is normally safe. Do you want to scan for IPMI
interfaces? (YES/no): Probing for `IPMI BMC KCS' at 0xca0...                      No
Probing for `IPMI BMC SMIC' at 0xca8...                     No
Some hardware monitoring chips are accessible through the ISA I/O ports.
We have to write to arbitrary I/O ports to probe them. This is usually
safe though. Yes, you do have ISA I/O ports even if you do not have any
ISA slots! Do you want to scan the ISA I/O ports? (YES/no): Probing for
`National Semiconductor LM78' at 0x290...       No
Probing for `National Semiconductor LM79' at 0x290...       No
Probing for `Winbond W83781D' at 0x290...                   No
Probing for `Winbond W83782D' at 0x290...                   No
Lastly, we can probe the I2C/SMBus adapters for connected hardware
monitoring devices. This is the most risky part, and while it works
reasonably well on most systems, it has been reported to cause trouble
on some systems.
Do you want to probe the I2C/SMBus adapters now? (YES/no): Using driver
`i2c-piix4' for device 0000:00:07.3: Intel 82371AB PIIX4
ACPI
Module i2c-dev loaded successfully.
Now follows a summary of the probes I have just done.
Just press ENTER to continue:
Driver `coretemp':
* Chip `Intel digital thermal sensor' (confidence: 9)
Do you want to overwrite /etc/sysconfig/lm_sensors? (YES/no): Starting lm_sensors:
loading module coretemp [确定]
Unloading i2c-dev... OK
 

所有必需的内核模块加载完毕后,我们就可以使用sensor命令来检测当前主机的cpu的温度了:

[root@devops ~]# sensors
coretemp-isa-0000
Adapter: ISA adapter
ERROR: Can't get value of subfeature temp1_input: Can't read
Physical id 0:  +0.0°C  (high = +100.0°C, crit = +100.0°C)
ERROR: Can't get value of subfeature temp2_input: Can't read
Core 0:         +0.0°C  (high = +100.0°C, crit = +100.0°C)
 

linux/unix: 如何根据文件的访问时间或更改时间来查找文件

linux find 命令果你不记的你要想找的文件到底放在什么目录下了,但是你只记得那些文件是在几个月前从网上下载下来的,这个时候我们如何才能找到这些文件呢?
首先你需要使用find命令来查找文件,如果有linux文件系统知识的人,大家应该知道每个文件都有三个属性,atime,ctime,mtime,这个三个属性会记录文件的最后一次的特定操作属性。
其中,

  • atime-最后一次读文件的时间
  • ctime-最后一次更改文件属性的时间
  • mtime-最后一次更改文件内容的时间

那么有了这个三个文件属性,就可以使用find命令结合这个三个属性来查找到你的文件。
下面以mtime为例子做说明:
-mtime +10 是指要查找到10天前最后一次更改的所有文件
-mtime -10 是指要查找到小于10天的最后一次更改的所有文件
-mtime 10  是要查找到正好10天的最后一次更改内容的所有文件
例子:
1.查找10天前更改的所有的.txt文件

#find /root -iname  "*.txt" -mtime +10 -print
 

2.显示10天前更改的所有的.txt文件的内容

#find /root -iname "*.txt" -mtime +10 -exec cat {} \;
 

更多参考:
1.其它关于Linux find 命令的用法   https://www.osetc.com/?s=find
2. linux find命令按用户和用户组来查找文件
3. find man帮助 

Bash脚本15分钟进阶教程

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。

脚本安全

我的所有bash脚本都以下面几句为开场白:

    #!/bin/bash
    set -o nounset
    set -o errexit

这样做会避免两种常见的问题:

  1. 引用未定义的变量(缺省值为“”)
  2. 执行失败的命令被忽略

需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”。
还要注意的是,在“errexit”模式下,虽然能有效的捕捉错误,但并不能捕捉全部失败的命令,在某些情况下,一些失败的命令是无法检测到的。(更多细节请参考这个帖子。)

脚本函数

在bash里你可以定义函数,它们就跟其它命令一样,可以随意的使用;它们能让你的脚本更具可读性:

    ExtractBashComments() {
        egrep "^#"
    }
    cat myscript.sh | ExtractBashComments | wc
    comments=$(ExtractBashComments < myscript.sh)

还有一些例子:

    SumLines() {  # iterating over stdin - similar to awk
        local sum=0
        local line=””
        while read line ; do
            sum=$((${sum} + ${line}))
        done
        echo ${sum}
    }
    SumLines < data_one_number_per_line.txt
    log() {  # classic logger
       local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: "
       echo "${prefix} $@" >&2
    }
    log "INFO" "a message"

尽可能的把你的bash代码移入到函数里,仅把全局变量、常量和对“main”调用的语句放在最外层。

变量注解

Bash里可以对变量进行有限的注解。最重要的两个注解是:

  1. local(函数内部变量)
  2. readonly(只读变量)
    # a useful idiom: DEFAULT_VAL can be overwritten
    #       with an environment variable of the same name
    readonly DEFAULT_VAL=${DEFAULT_VAL:-7}
    myfunc() {
       # initialize a local variable with the global default
       local some_var=${DEFAULT_VAL}
       ...
    }

这样,你可以将一个以前不是只读变量的变量声明成只读变量:

x=5
x=6
readonly x
x=7   # failure

尽量对你bash脚本里的所有变量使用localreadonly进行注解。

$()代替反单引号(`)

反单引号很难看,在有些字体里跟正单引号很相似。$()能够内嵌使用,而且避免了转义符的麻烦。

# both commands below print out: A-B-C-D
echo "A-`echo B-\`echo C-\\\`echo D\\\`\``"
echo "A-$(echo B-$(echo C-$(echo D)))"

[[]](双层中括号)替代[]

使用[[]]能避免像异常的文件扩展名之类的问题,而且能带来很多语法上的改进,而且还增加了很多新功能:

操作符 功能说明
|| 逻辑or(仅双中括号里使用)
&& 逻辑and(仅双中括号里使用)
< 字符串比较(双中括号里不需要转移)
-lt 数字比较
= 字符串相等
== 以Globbing方式进行字符串比较(仅双中括号里使用,参考下文)
=~ 用正则表达式进行字符串比较(仅双中括号里使用,参考下文)
-n 非空字符串
-z 空字符串
-eq 数字相等
-ne 数字不等

单中括号:

[ "${name}" \> "a" -o ${name} \< "m" ]

双中括号

[[ "${name}" > "a" && "${name}" < "m"  ]]

正则表达式/Globbing

使用双中括号带来的好处用下面几个例子最能表现:

t="abc123"
[[ "$t" == abc* ]]         # true (globbing比较)
[[ "$t" == "abc*" ]]       # false (字面比较)
[[ "$t" =~ [abc]+[123]+ ]] # true (正则表达式比较)
[[ "$t" =~ "abc*" ]]       # false (字面比较)

注意,从bash 3.2版开始,正则表达式和globbing表达式都不能用引号包裹。如果你的表达式里有空格,你可以把它存储到一个变量里:

r="a b+"
[[ "a bbb" =~ $r ]]        # true

按Globbing方式的字符串比较也可以用到case语句中:

case $t in
abc*)  <action> ;;
esac

字符串操作

Bash里有各种各样操作字符串的方式,很多都是不可取的。
基本用户

    f="path1/path2/file.ext"
    len="${#f}" # = 20 (字符串长度)
    # 切片操作: ${<var>:<start>} or ${<var>:<start>:<length>}
    slice1="${f:6}" # = "path2/file.ext"
    slice2="${f:6:5}" # = "path2"
    slice3="${f: -8}" # = "file.ext"(注意:"-"前有空格)
    pos=6
    len=5
    slice4="${f:${pos}:${len}}" # = "path2"

替换操作(使用globbing)

    f="path1/path2/file.ext"
    single_subst="${f/path?/x}"   # = "x/path2/file.ext"
    global_subst="${f//path?/x}"  # = "x/x/file.ext"
    # 字符串拆分
    readonly DIR_SEP="/"
    array=(${f//${DIR_SEP}/ })
    second_dir="${arrray[1]}"     # = path2

删除头部或尾部(使用globbing)

    f="path1/path2/file.ext"
    # 删除字符串头部
    extension="${f#*.}"  # = "ext"
    # 以贪婪匹配方式删除字符串头部
    filename="${f##*/}"  # = "file.ext"
    # 删除字符串尾部
    dirname="${f%/*}"    # = "path1/path2"
    # 以贪婪匹配方式删除字符串尾部
    root="${f%%/*}"      # = "path1"

避免使用临时文件

有些命令需要以文件名为参数,这样一来就不能使用管道。这个时候 <() 就显出用处了,它可以接受一个命令,并把它转换成可以当成文件名之类的什么东西:

# 下载并比较两个网页
diff <(wget -O - url1) <(wget -O - url2)

还有一个非常有用处的是”here documents”,它能让你在标准输入上输入多行字符串。下面的’MARKER’可以替换成任何字词。

# 任何字词都可以当作分界符
command  << MARKER
...
${var}
$(cmd)
...
MARKER

如果文本里没有内嵌变量替换操作,你可以把第一个MARKER用单引号包起来:

command << 'MARKER'
...
no substitution is happening here.
$ (dollar sign) is passed through verbatim.
...
MARKER

内置变量

变量 说明
$0 脚本名称
$n 传给脚本/函数的第n个参数
$$ 脚本的PID
$! 上一个被执行的命令的PID(后台运行的进程)
$? 上一个命令的退出状态(管道命令使用${PIPESTATUS})
$# 传递给脚本/函数的参数个数
$@ 传递给脚本/函数的所有参数(识别每个参数)
$* 传递给脚本/函数的所有参数(把所有参数当成一个字符串)
提示
使用$*很少是正确的选择。
$@能够处理空格参数,而且参数间的空格也能正确的处理。
使用$@时应该用双引号括起来,像”$@”这样。

调试

对脚本进行语法检查:

bash -n myscript.sh

跟踪脚本里每个命令的执行:

bash -v myscripts.sh

跟踪脚本里每个命令的执行并附加扩充信息:

bash -x myscript.sh

你可以在脚本头部使用set -o verboseset -o xtrace来永久指定-v-o。当在远程机器上执行脚本时,这样做非常有用,用它来输出远程信息。

什么时候不应该使用bash脚本

  • 你的脚本太长,多达几百行
  • 你需要比数组更复杂的数据结构
  • 出现了复杂的转义问题
  • 有太多的字符串操作
  • 不太需要调用其它程序和跟其它程序管道交互
  • 担心性能

这个时候,你应该考虑一种脚本语言,比如Python或Ruby。
(原文地址

如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据专家们,我是在对你们说。你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grepbzip2wcawksed等等,都是单线程的,只能使用一个CPU内核。
借用卡通人物Cartman的话,“如何我能使用这些内核”?
要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,这还要借助很少用到的–pipes 参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上,真的。

BZIP2

bzip2是比gzip更好的压缩工具,但它很慢!别折腾了,我们有办法解决这问题。
以前的做法:

cat bigfile.bin | bzip2 --best > compressedfile.bz2

现在这样:

cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2

尤其是针对bzip2,GNU parallel在多核CPU上是超级的快。你一不留神,它就执行完成了。

GREP

如果你有一个非常大的文本文件,以前你可能会这样:

grep pattern bigfile.txt

现在你可以这样:

cat bigfile.txt | parallel  --pipe grep 'pattern'

或者这样:

cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'

这第二种用法使用了 –block 10M参数,这是说每个内核处理1千万行——你可以用这个参数来调整每个CUP内核处理多少行数据。

AWK

下面是一个用awk命令计算一个非常大的数据文件的例子。
常规用法:

cat rands20M.txt | awk '{s+=$1} END {print s}'

现在这样:

cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'

这个有点复杂:parallel命令中的–pipe参数将cat输出分成多个块分派给awk调用,形成了很多子计算操作。这些子计算经过第二个管道进入了同一个awk命令,从而输出最终结果。第一个awk有三个反斜杠,这是GNU parallel调用awk的需要。

WC

想要最快的速度计算一个文件的行数吗?
传统做法:

wc -l bigfile.txt

现在你应该这样:

cat bigfile.txt | parallel  --pipe wc -l | awk '{s+=$1} END {print s}'

非常的巧妙,先使用parallel命令‘mapping’出大量的wc -l调用,形成子计算,最后通过管道发送给awk进行汇总。

SED

想在一个巨大的文件里使用sed命令做大量的替换操作吗?
常规做法:

sed s^old^new^g bigfile.txt

现在你可以:

cat bigfile.txt | parallel --pipe sed s^old^new^g

…然后你可以使用管道把输出存储到指定的文件里。
原文地址

Linux:如何更改目录下特定权限的文件为其它权限

linux find 命令对于一个系统管理员,有时候需要更改目录下所有特定权限的文件为其它的权限,比如我想把/home目录下所有的权限为644的文件更改为777权限,那么我们有什么好的办法来实现吗?
大家应该都知道如果想更改权限的话,可以是用chmod命令,如果要递归更改目录下所有子目录下的文件的权限,可以再chomd后面加上“-R”选项。下面我们通过使用find命令和chmod命令结合使用来实现我们上面的需求,更改特定权限的所有文件的权限为其它权限(有点绕,哈哈)。
首先我们使用find 命令查到根目录下所有权限为644的文件,输入下面的命令:

#find / -type f -perm 644 -print
 

然后将上面查找到的文件的权限更改为777

#find / -type f -perm 644 -print -exec chmod 777 {} \;
 

如果要更改根目录下所有的目录或子目录的权限也为777,输入下面的命令:

#find / -type d -perm 644 -print -exec chmod 777 {} \;
 

示例:

[root@devops test]# ls -al
总用量 12
drwxr-xr-x. 3 root root 4096 6月  29 00:39 .
drwxrwxrwt. 4 root root 4096 6月  29 00:01 ..
-rw-r--r--. 1 root root    0 6月  28 12:18 t1
-rw-r--r--. 1 root root    0 6月  28 12:18 t10
-rw-r--r--. 1 root root    0 6月  28 12:18 t10.bak
-rw-r--r--. 1 root root    0 6月  28 12:18 t2
-rw-r--r--. 1 root root    0 6月  28 12:18 t2.bak
-rw-r--r--. 1 root root    0 6月  28 12:18 t3
-rw-r--r--. 1 root root    0 6月  28 12:18 t3.bak
-rw-r--r--. 1 root root    0 6月  28 12:18 t4
-rw-r--r--. 1 root root    0 6月  28 12:18 t5
-rw-r--r--. 1 root root    0 6月  28 12:18 t5.bak
-rw-r--r--. 1 root root    0 6月  28 12:18 t6
-rw-r--r--. 1 root root    0 6月  28 12:18 t7
-rw-r--r--. 1 root root    0 6月  28 12:18 t7.bak
-rw-r--r--. 1 root root    0 6月  28 12:18 t8
-rw-r--r--. 1 root root    0 6月  28 12:18 t8.bak
-rw-r--r--. 1 root root    0 6月  28 12:18 t9
-rw-r--r--. 1 root root    0 6月  28 12:18 t9.bak
drwxr-xr-x. 2 root root 4096 6月  29 00:39 testdir
[root@devops test]# find . -type f -perm 644 -print -exec chmod 777 {} \;
./t7
./t2
./t10
./t1
./t9.bak
./t6
./t10.bak
./t7.bak
./t5
./t2.bak
./t8.bak
./t4
./t3.bak
./t3
./t8
./t9
./t5.bak
[root@devops test]# ls -al
总用量 12
drwxr-xr-x. 3 root root 4096 6月  29 00:39 .
drwxrwxrwt. 4 root root 4096 6月  29 00:01 ..
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t1
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t10
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t10.bak
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t2
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t2.bak
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t3
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t3.bak
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t4
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t5
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t5.bak
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t6
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t7
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t7.bak
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t8
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t8.bak
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t9
-rwxrwxrwx. 1 root root    0 6月  28 12:18 t9.bak
drwxr-xr-x. 2 root root 4096 6月  29 00:39 testdir
[root@devops test]#
 

更多参考:
1.Linux/Unix:通过linux find命令删除查找到的文件

Linux下如何只显示目录名或者普通文件名

linux find 命令linux下显示文件的时候或者查询文件的时候,如何只显示出目录文件的名字或者普通文件的名字呢?
当然,大家可能想到的第一个命令是“ls”来显示目录下的文件,但是“ls”命令显示的结果不能只显示目录文件,这个时候我们就需要考虑将ls命令和grep命令相结合来使用。

显示出当前目录下的所有的目录文件
输入下面的命令:

# ls -l | egrep '^d'
 


只显示当前目录下的普通文件
输入下面的命令:

#ls -l | egrep -v '^d'
 

上面用到egrep命令是grep命令的增强版本,它会通过后面的匹配模式(‘^’)来过滤由管道符传来的字符串。如果想显示非匹配到的普通文件,那么可以加”-v” 选项用来反转查找。
如果在平时工作的时候会经常需要上面的操作(只显示目录或只显示文件),那么可以创建别名,这样可以节省很多时间。

alias lf="ls -l | egrep -v '^d'"
alias ldir="ls -l | egrep '^d'"
 

将上面的两行alias命令放入bash shell的启动文件.bash_profile里,这样每次启动新的shell程序的时候,都会自动执行。
示例:
1.通过输入下面的命令来只显示出普通文件名

[root@devops ~]# lf
总用量 176
-rw-------. 1 root root    1124 12月 12 2013 anaconda-ks.cfg
-rw-------. 1 root root  184320 12月 12 2013 core.2410
-rw-r--r--. 1 root root   14540 11月  5 2012 epel-release-6-8.noarch.rpm
-rwxr--r--. 1 root root     257 12月 13 2013 GetCheckCpu.sh
-rwxr--r--. 1 root root     258 12月 13 2013 GetCheckMem.sh
-rw-r--r--. 1 root root    3827 12月 12 2013 install.log.syslog
-rw-r--r--. 1 root root     322 4月  18 04:28 rmdir.py
-rw-r--r--. 1 root root     219 4月  18 01:31 rmfile1.py
-rw-r--r--. 1 root root     170 4月  18 01:46 rmfile2.py
-rwxr--r--. 1 root root     160 4月  18 01:56 rmfile.py
-rwxr-xr-x. 1 root root    6293 12月 12 2013 seg
-rw-r--r--. 1 root root      96 12月 12 2013 seg.c
-rwxr-xr-x. 1 root root    7822 4月  18 10:19 test
-rw-r--r--. 1 root root      67 4月  18 10:10 test.c
-rw-r--r--. 1 root root      75 4月  18 10:18 test.C
-rw-rw-r--. 1 root root       0 4月  16 08:57 test.log
-rw-r--r--. 1 root root       0 2月  27 06:59 testmv
-rw-r--r--. 1 root root       0 2月  27 07:00 test.txt
 

2.只显示出当期目录的目录文件名

[root@devops ~]# ldir
drwxr-xr-x. 2 root users   4096 4月  16 09:05 testdir
drwxr-xr-x. 2 root root    4096 6月  28 22:12 testdir2
drwxr-xr-x. 2 root root    4096 6月  28 22:12 testdir3
[root@devops ~]#
 


通过Find 命令来只显示普通文件名或目录文件名
1.输入下面的find命令来显示出/home目录下的所有的目录文件名

[root@devops home]# find /home -type d -ls
391685    4 drwxr-xr-x   8 root     root         4096 4月 16 15:29 /home
391763    4 drwx------   4 USER1    USER1        4096 4月 16 11:44 /home/USER1
391764    4 drwxr-xr-x   4 USER1    USER1        4096 12月 12  2013 /home/USER1/.mozilla
392065    4 drwxr-xr-x   2 USER1    USER1        4096 8月 18  2010 /home/USER1/.mozilla/extensions
392066    4 drwxr-xr-x   2 USER1    USER1        4096 8月 18  2010 /home/USER1/.mozilla/plugins
392070    4 drwxr-xr-x   2 USER1    USER1        4096 11月 12  2010 /home/USER1/.gnome2
392079    4 drwx------   4 user2    user2        4096 4月 16 15:29 /home/user2
392080    4 drwxr-xr-x   4 user2    user2        4096 12月 12  2013 /home/user2/
 

搞定!
更多参考:
1.grep 命令
2. grep显示匹配到的行数目
3.grep如何同时查找多个字符串匹配

Linux/Unix:如何查找linux或unix服务器上的文件

linux find 命令于linux新手来说,需要查找linux或unix服务器上的某个或某些特定模式的文件,那么如何来定位或查找这些文件呢?
你需要使用find 命令或者locate命令在linux服务器或者类unix服务器上查找文件。
linux find 命令用法
linux find 命令主要用来查找文件,该命令可以查找到你指定的特定目录下的符合特定模式的普通文件或目录文件,指定的查找条件可以是用户名,用户组,文件类型,文件权限,文件创建日期,时间等。而且更重要的一点是find命令可以递归查找整个指定目录下的文件。
使用方法如下:
find {目录} -name {文件名} 动作
该命令默认的对查找到的文件执行的操作是在标准输出上打印查找到的文件,也就是下面的命令:
find / -name “file pattern” -print
Find 命令的示例
1.查找整个根目录下的名为“a.txt”的文件

#find / -name a.txt
 

2.查找/etc/目录下的所有”.conf”普通文件

#find /etc  -type f -name "*.conf"
 

3.查找/home/目录下的除了”*.css”的所有文件
为了查找到除了特定模式下的所有其它文件,可以使用-not 选项 或者“!”

#find /home -not -name "*.css" -print
 

或者

#find /home \! -name "*.css" -print
 

按文件类型查找文件
使用方法如下:

find /dir -type {f|d|l} -name "file pattern" -print
 

其中:
类型选项:

  • f:只查找普通文件
  • d:只查找目录文件
  • l:只查找链接文件

示例:
1.查找/home目录下的所有.c的普通文件

#find /home -type f -name "*.c" -print
 

2.查找/home目录下的所有包含var的目录文件

#find /home -type d -name "*var" -print
 

对查找到的文件执行操作
我们可以对通过find 命令查找到的文件执行某些相应的命令,用法如下:

find /dir -name "file pattern" -exec command {} \;
find /dir -iname "file pattern" -exec command {} \;
 

示例:
1.查找/home目录下的所有“*.sh”文件,并将这些文件的权限设置为777

#find /home -type f -iname "*.sh" -exec chmod 777 {} \;
 

更多参考:
1.其它关于Linux find 命令的用法
2. linux find命令按用户和用户组来查找文件
3. find man帮助 

Linux/Unix:通过linux find 命令查找特定用户或用户组的文件

linux find 命令linux或类unix操作系统里,如何来查找特定用户组或用户创建的文件呢?我们可以使用强大的 linux find 命令来查找文件。这个命令里有参数可以用来查找特定用户或用户组的文件。
通过用户组查找文件
使用下面的方法:
find 目录 -group {用户组} -name {文件名}
其中,

  • 目录:指定要查找的目录
  • 用户组:根据指定的用户组来查找文件
  • 文件名:查找该模式的文件名

示例:
1.查找所有在根目录下的属于”apache”用户组的文件:

#find / -group apache
 

命令输出:

[root@devops ~]# find / -group apache |less
/usr/share/bugzilla
/usr/share/bugzilla/report.cgi
/usr/share/bugzilla/search_plugin.cgi
/usr/share/bugzilla/buglist.cgi
/usr/share/bugzilla/testserver.pl
/usr/share/bugzilla/sanitycheck.pl
/usr/share/bugzilla/runtests.pl
/usr/share/bugzilla/skins
/usr/share/bugzilla/skins/contrib
/usr/share/bugzilla/skins/contrib/Dusk
/usr/share/bugzilla/skins/contrib/Dusk/index.css
/usr/share/bugzilla/skins/contrib/Dusk/index
/usr/share/bugzilla/skins/contrib/Dusk/index/search.gif
 

2. 查找根目录下的所有属于“apache”用户组并且包含”*.css”的文件

# find / -group apache -name "*.css"
 

命令输出:

[root@devops ~]# find / -group apache -name "*.css"  |less
/usr/share/bugzilla/skins/contrib/Dusk/index.css
/usr/share/bugzilla/skins/contrib/Dusk/global.css
/usr/share/bugzilla/skins/contrib/Dusk/buglist.css
/usr/share/bugzilla/skins/standard/yui/calendar.css
/usr/share/bugzilla/skins/standard/duplicates.css
/usr/share/bugzilla/skins/standard/admin.css
/usr/share/bugzilla/skins/standard/params.css
/usr/share/bugzilla/skins/standard/index.css
/usr/share/bugzilla/skins/standard/create_attachment.css
 

如果想忽略大小来查找,可以使用下面的命令:

#find / -group apache -iname "*.css"
 

通过用户来查找文件
用法如下:
find 目录 -user {用户名} -name {文件名}
其中,

  • 目录:指定要通过find命令查找的目录
  • 用户名:根据提供的用户来查找文件
  • 文件名: 指定要查找的文件模式

示例:
1.查找根目录下所有的由“root”用户创建的文件

#find / -user root
 

命令输出:

[root@devops ~]# find / -user root | more
/
/tmp
/tmp/.ICE-unix
/tmp/yum_save_tx-2014-04-18-09-587aonle.yumtx
/tmp/install.log
/tmp/test
/tmp/test/t7
/tmp/test/t2
/tmp/test/t10
/tmp/test/t1
 

2.查找根目录下所有的属于root用户并且包含”*.css”的文件名

#find / -user root -name "*.css"
 

命令输出:

[root@devops ~]# find / -user root -name "*.css"| more
/usr/share/bugzilla/skins/contrib/Dusk/index.css
/usr/share/bugzilla/skins/contrib/Dusk/global.css
/usr/share/bugzilla/skins/contrib/Dusk/buglist.css
/usr/share/bugzilla/skins/standard/yui/calendar.css
/usr/share/bugzilla/skins/standard/duplicates.css
 

更多参考:
1.1.其它关于Linux find 命令的用法
2. find man帮助

Linux/Unix:通过linux find命令删除查找到的文件

linux find何在linux操作系统或是类unix系统下使用linux find命令去查找文件并且将查找到的所有文件都删除呢?有时候我们不仅需要查找到文件还需要将其删除,但是传统的linux rm命令并不支持搜索功能,这个时候我们可以使用find命令去搜索特定目录下文件然后将文件删除。你可以将find命令和rm 命令结合起来去实现这个操作。
查找并删除文件
我们可以使用下面的命令来查找并删除文件:
find [directory] [patern] [action] 其中,
directory:指定要查找的目录
patern: 指定要查找的模式比如:*.jpg
action:  指定对查找的文件执行什么操作
为了删除多个文件名包含*.jpg 文件,使用下面的命令

find . -name  "*.jpg" -exec rm -rf {} \;

或者

find . -type f -name "*.jpg" -exec rm -f {} \;

上面的两个命令唯一的区别是第一个命令可以删除目录,而第二命令只能删除文件。
其中,
-name: 文件名匹配
-exec rm -rf {} \;: 删除所有匹配到模式的文件
-type f: 只匹配普通文件(不包括目录文件)
find命令实例:
1.查找当前目录下所有的包含*.bak的文件并删除它们
# find . -type f -name “*.bak” -exec rm -f {}\;
2.查找根目录下所有core文件并删除
# find / -name core -exec rm -f {} \;
3.查找当前目录下的所有包含*.bak的文件并删除所有查找到文件,删除是需要用户确认
#find . -type f -name “*.bak” -exec rm -i {} \;
命令输出:

[root@devops test]# find . -type f -name "*.bak" -exec rm -i {} \;
rm:是否删除普通空文件 "./t1.bak"?y
rm:是否删除普通空文件 "./t4.bak"?y
rm:是否删除普通空文件 "./t6.bak"?y

更多参考:
1.其它关于Linux find 命令的用法
2. find man帮助
3. Linux 删除文件

linux:如何将标准错误输出重定向到文件

linux 命令
对于linux新手来说,可能已经知道如何将屏幕输出的内容保存到一个文件里,也就是说使用linux shell中的重定向符来将命令或者程序的标准输出保存到某个文件里,而不会在屏幕上输出了。
大家应该都知道,linux shell里有三种输入输出信息,那就是标准输入(stdin),标准输出(stdout)和标准错误输出(stderr), 那么本文下面要说的就是如何将标准错误输出也保存到某一个文件里。
重定向错误输入到文件
使用下面的方式来将命令的错误输出重定向到文件:

命令 2> errfile

如果想将标准错误输出重定向和标准输出的地方,可以使用下面的方法:

命令 2>&1 >file

将标准输出和标准错误输出定位到不同的文件

命令 >stdfile 2>errfile

Linux:Bash shell如何删除目录下除了特定类型文件外的所有文件

于在linux环境下工作的人来说,需要经常对目录下的文件做操作,包括创建文件,删除文件,链接文件,或者拷贝文件等等。现在有一个需求是,如何通过bash shell 删除特定目录下的除了文件名包含.gz 或者.zip的所有文件?我们平时做的最多的关于删除文件的操作是删除特定模式的文件,通过使用rm命令,再加上linux下三个通配符:*,?, [..].
其中:* – 是匹配任意字符
?- 匹配任意一个单一字符
[…] – 匹配任意一个方括号中的字符

通过使用shopt扩展模式匹配

如果之前使用过shopt命令的话,应该都知道shopt和set命令类似,用来定制shell的环境。下面我们通过下面的shopt命令来扩展shell的模式匹配功能,这样的话,上面的三个通配符的功能会被扩展,而且还会引入新的元字符。

[root@devops work]# shopt -s extglob

之后我们就可以使用特有的元字符“!”来删除除特定文件之外的所有文件,下面是一个具体的例子:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# rm -rf !(aa.tar.gz)
-bash: !: event not found
[root@devops work]# shopt -s extglob
[root@devops work]# rm -rf !(*.gz)
[root@devops work]# ls
aa.tar.gz

当删除完文件之后,可以使用下面的命令关掉extglob选项。
[root@devops work]# shopt -u extglob

通过使用grep和rm命令结合来实现删除除特定文件的所有文件

我们可以使用grep命令特有的选项“-v”来查找出所有除特定文件的所有文件,然后再通过rm命令来删除,下面再举个例子:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# ls | grep -v '.gz' | xargs rm -rf
[root@devops work]# ls
aa.tar.gz

或者

rm `ls | grep -v '.gz'`

通过find命令来删除除特定文件外的所有文件

使用过find的人应该都知道,find命令的功能相当的强大,选项众多。我们可以使用下面的命令来实现该需求:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# find ./ -type f -not -name '*.gz' -delete
[root@devops work]# ls
aa.tar.gz
[root@devops work]#

 
 

Linux设置和查看环境变量的方法

linux 查看环境变量与设置环境变量在使用过程中很常见,本文整理了一些常用的与环境变量相关的命令,感兴趣的朋友可以参考下希望对你有所帮助.

1. 显示环境变量HOME

$ echo $HOME
/home/redbooks 

2. 设置一个新的环境变量hello

$ export HELLO="Hello!"
$ echo $HELLO
Hello! 

3. 使用env命令显示所有的环境变量

$ env
HOSTNAME=redbooks.safe.org
PVM_RSH=/usr/bin/rsh
Shell=/bin/bash
TERM=xterm
HISTSIZE=1000
... 

4. 使用set命令显示所有本地定义的Shell变量

$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
... 

5. 使用unset命令来清除环境变量
set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:
$ export TEST=”Test…” #增加一个环境变量TEST
$ env|grep TEST #此命令有输入,证明环境变量TEST已经存在了
TEST=Test…
$ unset $TEST #删除环境变量TEST
$ env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了

6. 使用readonly命令设置只读变量
如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:
$ export TEST=”Test…” #增加一个环境变量TEST
$ readonly TEST #将环境变量TEST设为只读
$ unset TEST #会发现此变量不能被删除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST=”New” #会发现此也变量不能被修改
-bash: TEST: readonly variable
环境变量的设置位于/etc/profile文件
如果需要增加新的环境变量可以添加下属行
export path=$path:/path1:/path2:/pahtN
———————————————————————————————————————–
1.Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:
1.1 永久的:需要修改配置文件,变量永久生效。
1.2 临时的:使用export命令声明即可,变量在关闭shell时失效。

2.设置变量的三种方法
2.1 在/etc/profile文件中添加变量【对所有用户生效(永久的)】
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
2.2 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bash_profile
$ vi /home/guok/.bash.profile
添加如下内容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。
2.3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

3.环境变量的查看
3.1 使用echo命令查看单个环境变量。例如:
echo $PATH
3.2 使用env查看所有环境变量。例如:
env
3.3 使用set查看所有本地定义的环境变量。
unset可以删除指定的环境变量。

4.常用的环境变量
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE  语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$

linux下如何配置java7的环境变量

java开发的第一步就是如何来配置java的开发环境,比如如何安装java开发包,如何配置java的环境变量,如何编译java程序。
1.解压安装jdk
在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,
执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车。之后会在当前目录下生成一个jdk1.6.0_14目录,你可以将它复制到 任何一个目录下。
2.需要配置的环境变量
1). PATH环境变量。作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把 jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好 PATH变量后,就可以在任何目录下执行javac/java等工具了。
2).CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们 需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
3).JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。
3.三种配置环境变量的方法
1).修改/etc/profile文件
如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。
·用文本编辑器打开/etc/profile
·在profile文件末尾加入:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录
·注解
a. 你要将 /usr/share/jdk1.6.0_14改为你的jdk安装目录
b. linux下用冒号“:”来分隔路径
c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值
在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种
常见的错误。
d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。
e. export是把这三个变量导出为全局变量。
f. 大小写必须严格区分。
2).修改.bash_profile文件
这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bash_profile文件就可以了。
·用文本编辑器打开用户目录下的.bash_profile文件
·在.bash_profile文件末尾加入:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录
3).直接在shell下设置变量
不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦。
只需在shell终端执行下列命令:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

4.测试jdk
1). 用文本编辑器新建一个Test.java文件,在其中输入以下代码并保存:

public class test {
public static void main(String args[]) {
System.out.println("A new jdk test !");
}
}

2).编译:在shell终端执行命令 javac Test.java
3).运行:在shell终端执行命令 java Test
当shell下出现“A new jdk test !”字样则jdk运行正常。
5.卸载jdk
·找到jdk安装目录的_uninst子目录
·在shell终端执行命令./uninstall.sh即可卸载jdk。

Linux命令nohup和screen命令的区别

如果想在关闭ssh连接后刚才启动的程序继续运行怎么办,可以使用nohup。但是如果要求第二天来的时候,一开ssh,还能查看到昨天运行的程序的状态,然后继续工作,这时nohup是不行了,需要使用screen来达到这个目的。
nohup命令可以用来执行其他命令,并且忽略SIGHUP信号(run a command immune to hangups, with output to a non-tty。Run COMMAND, ignoring hangup signals.)当一个虚拟终端的网络连接断开时,操作系统向正在运行的程序发送SIGHUP信号(HUP = HangUP、挂断),默认情况下这个信号将使程序退出。
1.nohup命令
问题1为什么ssh一关闭,程序就不再运行了?
元凶:SIGHUP 信号
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
在Linux/Unix中,有这样几个概念:
进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!! 导致一旦ssh关闭,执行中的任务就取消了
例子:
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
[root@tivf09 root]# top
在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。

[root@tivf09 root]# ps -ef|grep top
root      5180  5128  0 01:03 pts/0    00:00:02 top
root      5857  3672  0 01:12 pts/2    00:00:00 grep top

使用pstree命令可以更清楚地看到这个关系:

[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd---bash---top

使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。

[root@tivf09 root]# ps -xj|grep 5128
5126  5128  5128  5128 pts/0     5180 S        0   0:00 -bash
5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128

关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。

[root@tivf09 root]# ps -ef|grep 5128
root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128

问题2   为什么守护程序就算ssh 打开的,就算关闭ssh也不会影响其运行?
因为他们的程序特殊,比如httpd –k start运行这个以后,他不属于sshd这个进程组  而是单独的进程组,所以就算关闭了ssh,和他也没有任何关系!

[root@CentOS5-4 ~]# pstree |grep http
|-httpd
[root@CentOS5-4 ~]# pstree |grep top
|-sshd-+-sshd---bash---top

结论:守护进程的启动命令本身就是特殊的,和一般命令不同的,比如mysqld_safe 这样的命令 一旦使用了  就是守护进程运行。所以想把一般程序改造为守护程序是不可能,
问题3 使用后台运行命令&  能否将程序摆脱ssh进程组控制呢  也就是ssh关闭,后台程序继续运行?
我们做一个试验:  find / -name ‘*http*’ &
利用ctrl+d 注销以后 再进入系统  会不会看见这个命令再运行?
答案是  :命令被中止了!!
因为他依然属于这个ssh进程组 就算加了&也无法摆脱!!

[root@CentOS5-4 ~]# pstree |grep find
|-sshd-+-sshd---bash---find

结论就是:只要是ssh 打开执行的一般命令,不是守护程序,无论加不加&,一旦关闭ssh,系统就会用SIGHUP终止
问题4  nohup能解决的问题
但是为了能够再注销以后 依然能后台运行,那么我们就可以使用nohup这个命令,我们现在开始查找find / -name ‘*http*’ &
,并且希望在后台运行,
那么就使用nohup:nohup find / -name “*httpd*”
此时默认地程序运行的输出信息放到当前文件夹的 nohup.out 文件中去
加不加&并不会影响这个命令   只是让程序 前台或者后台运行而已
 
2. screen命令
虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。
1)使用
执行screen , 按任意键进入子界面;
我用ping命令开始执行,如果下班了,但是想关闭ssh以后ping继续运行,那么按ctrl+a   再按d   这样暂停了子界面,会显示[detached]的字样,这时候 我回到了父界面;
用screen –ls查看目前子界面的状态 screen -ls
There is a screen on: 22292.pts-3.free (Detached)
1 Socket in /tmp/screens/S-root,这里的22292其实是子界面的pid号;
如果回到子界面 用screen –r 22292,一下子弹到了ping 的子界面;
2)更多帮助
可以通过C-a(ctrl+a) ?来查看所有的键绑定,常用的键绑定有:
C-a ?
显示所有键绑定信息
C-a w
显示所有窗口列表
C-a C-a
切换到之前显示的窗口
C-a c
创建一个新的运行shell的窗口并切换到该窗口
C-a n
切换到下一个窗口
C-a p
切换到前一个窗口(与C-a n相对)
C-a 0..9
切换到窗口0..9
C-a a
发送 C-a到当前窗口
C-a d
暂时断开screen会话
C-a k
杀掉当前窗口
C-a [
进入拷贝/回滚模式
其他常用选项:
-c file
使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num
指定历史回滚缓冲区大小为num行
-list|-ls
列出现有screen会话,格式为pid.tty.host
-d -m
启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname
创建screen会话时为会话指定一个名字
-v
显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话

linux time 命令详细用法

time 命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统时间的(这是date命令干的事情)。但是今天我通过查看time命令的手册页,发现它能 做的不仅仅是测量运行时间,还可以测量内存、I/O等的使用情况,手册页上的说法是time a simple command or give resource usage,其中time一词我认为它应该是测量或测定的意思,并不单指时间。一个程序在运行时使用的系统资源通常包括CPU、Memory和I/O等, 其中CPU资源的统计包括实际使用时间(real time)、用户态使用时间(the process spent in user mode)、内核态使用时间(the process spent in kernel mode)。但是简单的使用time命令并不能得到内存和I/O的统计数据,请看后文慢慢道来。
常用参数
time命令最常用的使用方式就是在其后面直接跟上命令和参数:
time <command> [<arguments…>] 在命令执行完成之后就会打印出CPU的使用情况:
real    0m5.064s      <== 实际使用时间(real time)
user    0m0.020s     <== 用户态使用时间(the process spent in user mode)
sys     0m0.040s      <== 内核态使用时间(the process spent in kernel mode)
time命令跟上-p参数可以只打印时间数值(秒数),不打印单位。
使用示例
示例一 统计运行时间

[root@web186 root]# time find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
real    0m14.837s
user    0m0.030s
sys     0m0.120s

[root@web186 root]#
注:real远大于user加上sys,因为find需要遍历各个目录,需要大量的I/O操作,而磁盘I/O通常是最慢的环节,因此大部分时间find进程都在等待磁盘I/O完成。

[root@web186 root]# time find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
real    0m0.230s
user    0m0.040s
sys     0m0.030s

注:再次运行的时候,发现real time变得很小了,应该是操作系统将刚才操作过的一些文件缓存了的缘故,因而大大减少了磁盘I/O。

[root@web186 root]# time -p find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
real 0.15
user 0.04
sys 0.03

注:使用-p参数时,直接打印所需时间的数值,单位为秒,而不是更友好的格式,包括分钟、秒钟的显示方式。
[root@web186 root]#
示例二 Linux系统中time命令其实不止一个
看过手册页的朋友,会发现有个-f参数可以来指定统计信息的输出格式,我们也来试一下。

[root@web186 root]# time -f "real %f\nuser %f\nsys %f\n" find . -name "mysql.sh"
-bash: -f: command not found
real    0m0.024s
user    0m0.000s
sys     0m0.000s

怪哉,不灵啊。使用type -a来看一下。使用这个shell内建命令经常会有意想不到的发现。

[root@web186 root]# type -a time
time is a shell keyword
time is /usr/bin/time

注:通过这条命令我们可以发现我们常用的time其实是一个Shell关键字,还有一个外部命令/usr/bin/time,它有何不同呢?

[root@web186 root]# /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--help] command [arg...]

注:外部命令/usr/bin/time功能更强大,下面来尝试一下。

[root@web186 root]# /usr/bin/time find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
0.03user 0.04system 0:00.12elapsed 55%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (154major+63minor)pagefaults 0swaps

注:注意后面两行,打印了很多信息,但看不太清楚。它有一个参数-v,可以打印得更清楚些。

[root@web186 root]# /usr/bin/time -v find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
Command being timed: "find . -name mysql.sh"
User time (seconds): 0.03
System time (seconds): 0.05
Percent of CPU this job got: 47%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.17
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 153
Minor (reclaiming a frame) page faults: 64
Voluntary context switches: 0
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
[root@web186 root]#

尝试完这个之后,我看了一下Google搜索的结果,发现有位大虾早已发现了这个秘密,见相关资料【1】。
示例三 解决time命令输出信息的重定向问题
time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。

[root@web186 root]# time find . -name "mysql.sh" >1.txt
real    0m0.081s
user    0m0.060s
sys     0m0.020s
[root@web186 root]# time find . -name "mysql.sh" 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
real    0m0.068s
user    0m0.040s
sys     0m0.030s

通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命 令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了 两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。
[root@web186 root]# {time find . -name “mysql.sh”} 2>2.txt
好像成功了。慢,看一下对不对。
[root@web186 root]# cat 2.txt
-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。
[root@web186 root]# { time find . -name “mysql.sh” } 2>2.txt
> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。

[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
[root@web186 root]# cat 2.txt
real    0m0.068s
user    0m0.030s
sys     0m0.040s

第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file  注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:

[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
[root@web186 root]# cat 2.txt
real    0m0.083s
user    0m0.040s
sys     0m0.020s
[root@web186 root]#

第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。

Linux Shell脚本的10个有用的“面试问题和解答”

首先致上每日问候。Linux的浩瀚无垠,使人总能每次都提交与众不同的内容。我们“The-Tecmint-Team”的工作是给我们的读者提供一些独特的内容,这些内容不仅对他们的职业生涯很有用,同时也让他们增长知识。在此,我们就尝试这么去做,至于能取得多大的成功,就由我们的读者朋友们来判断吧。
Questions on Shell Scripting
我们为各类用户提供了关于Shell脚本语言和面试问题的很多教程,可以访问以下链接去阅读这些文章。

在此,作为shell脚本的附加内容,在本文中我们将从面试的角度解读与Linux Shell相关的问题。

1. 在shell脚本成功执行前,如何中断脚本执行?

解答:我们需要使用‘exit’命令来实现以上描述的情境。‘exit’命令被强制输出非0值时,脚本会报错并退出。在Unix环境下的shell脚本中,0值表示成功执行。因此,在脚本终止前执行一个不带引号的‘exit -1’命令将使脚本中止。

例如,创建以下一个名为“anything.sh”的脚本。

  1. #!/bin/bash
  2. echo “Hello”
  3. exit -1
  4. echo “bye”

保存文件并执行。

  1. # sh anything.sh
  2. Hello
  3. exit.sh: 3: exit: Illegal number: -1

从上面的脚本中可以清楚地看到,在exit -1命令前,脚本执行得很好。

2. 如何使用Linux命令来移除文件头?

解答:当我们需要删除文件中的指定行时,‘sed’命令可以用来解决该问题。

这个是用来删除文件头(文件的首行)的正确命令。

  1. # sed ‘1 d’ file.txt

上面命令的问题是,它会在标准输出设备上输出不带首行的文件内容。为了保存输出到文件,我们需要使用重定向操作符,它将帮助你将输出重定向到文件。

  1. # sed ‘1 d’ file.txt > new_file.txt

好吧,其实sed命令内建的‘-i’开关就可以干这活,就不需要重定向符了吧。

  1. # sed -i ‘1 d’ file.txt

3. 你怎么检查一个文本文件中某一行的长度?

解答:‘sed’命令也可以用来查找文本文件中的某一行或者检查其长度。

sed -n ‘n p’ file.txt’可以解决,这里‘n’表示行号,‘p’打印出匹配内容(到标准输出),该命令通常与-n命令行选项连用。那么,怎样来获取长度计数呢?很明显,我们需要通过管道输出给‘wc’命令来计算。

  1. # sed –n ‘n p’ file.txt | wc –c

要得到文本文件‘tecmint.txt’的第五行的长度,运行如下命令:

  1. # sed -n ‘5 p’ tecmint.txt | wc -c

4. 可以在Linux系统上查看到所有非打印字符吗?你是怎么做到的?

解答:可以。可以在Linux中查看所有的非打印字符。要实现上面所讲的方案,我们需要‘vi’编辑器的帮助。 怎样在‘vi’编辑器中显示非打印字符?

  • 打开vi编辑器。
  • 先按[esc]键,然后按‘:’进入到vi编辑器的命令模式。
  • 最后,从‘vi’编辑器的命令界面输入set list命令并执行。

: 这种方式可以查看文本文件中的所有非打印字符,包括ctrl+m(^M)

5. 假如你是一个员工组的团队领导,为xyz公司工作。公司要求你创建一个‘dir_xyz’目录,让该组成员都能在该目录下创建或访问文件,但是除了文件创建者之外的其他人不能删除文件,你会怎么做?

解答:这真是个有趣的工作方案。好吧,上面所讲的方案,我们需要通过下面的步骤来实施,这简直就是小菜一碟。

  1. # mkdir dir_xyz
  2. # chmod g+wx dir_xyz
  3. # chmod +t dir_xyz

第一行命令创建了一个目录(dir_xyz),上面的第二行命令让组(g)具有‘写’和‘执行’的权限,而上面的最后一行命令——权限位最后的‘+t’是‘粘滞位’,它用来替换‘x’,表明在这个目录中,文件只能被它们的拥有者、目录的拥有者或者是超级用户root删除。

6. 你能告诉我一个Linux进程经历的各个阶段吗?

解答:一个Linux进程在它的一生中,通常经历了四个主要阶段。

这里是Linux进程要经历的四个阶段。

  • 等待:Linux进程等待资源。
  • 运行:Linux进程当前正在执行中。
  • 停止:Linux进程在成功执行后或收到杀死进程信号后停止。
  • 僵尸:如果该进程已经结束,但仍然留在进程表中,被称为‘僵尸’。

7. Linux中cut命令怎么用?

解答:‘cut’是一个很有用的Linux命令,当我们要截取文件的指定部分并打印到标准输出,当文本区域以及文件本身很大时,这个命令很有用。

例如,截取‘txt_tecmint’文件的前10列。

  1. # cut -c1-10 txt_tecmint

要截取该文件中的第二,第五和第七列。

  1. # cut -d;-f2 -f5 -f7 txt_tecmint

8. ‘cmp’和‘diff’命令的区别是什么?

解答:‘cmp’和‘diff’命令用来获取相同的东西,但各有侧重。

diff’命令输出为了使两个文件一样而应该做的修改。而‘cmp’命令则将两个文件逐字节对比,并报告第一个不匹配的项。

9. 可以用‘echo’命令来替换‘ls’命令吗?

解答:可以的。‘ls’命令可以用‘echo’命令来替代。‘ls’命令列出目录内容,从替换上述命令的角度讲,我们可以使用‘echo *’,两个命令的输出完全一样。

10. 你可能听过inode吧。你能简要描述一下inode吗?

解答:‘inode’是一个‘数据结构’,在Linux上用于文件标识。每个文件在Unix系统上有一个独立的‘inode’和一个‘唯一的’inode号。

到此为止吧。在下一篇文章中,我们将讨论另外一些有趣味性而又有知识性的面试问题。到那时,别跑开,请上Tecmint.com,别忘了在下面的评论部分给我们提供一些有价值的反馈哦。


 
原文地址

Ubuntu Linux上的最佳照片应用程序

在我上次写切换到Linux的理由后,一位读者建议我写一些关于Windows上流行的应用程序的Linux替代品的内容。毕竟,这是想切换到Linux的Windows用户们最普遍关心的问题。
在本文中,我列出了可用于各种用途的与照片相关的应用程序,努力试图来回应大家普遍关心的问题。这个列表中的应用程序并非是Windows程序的替代品,而只是能用于多种用途的Linux下的图像应用程序的集合。

Linux中的图像编辑应用

当我提到图像编辑时,我是指骨灰级专业风格的照片编辑。换句话讲,我是在讨论Photoshop。而对于Adobe Photoshop的Linux替代品而言,只有一个名字浮现在我脑海里,那就是GIMP。GIMP是一个跨平台、全功能、专业级别的编辑软件,几乎囊括了Photoshop的全部功能。与Photoshop不同的是,GIMP对于所有平台都免费,如Linux,Windows,OS X等等。
你可以从Ubuntu软件中心来为Ubuntu安装GIMP。
如果你醉心于Photoshop,并且对于调整GIMP的外观和快捷键有一定难度,那我推荐你使用Gimpshop。它是一个基于GIMP,而又有Photoshop风格的应用程序,当然也是免费的。

Linux中的照片管理应用

这里我是在说处理图像仓库的应用程序。你可以查看图像,从照相机和手机导入图像,进行图像的简单编辑,分享图像等等。在Windows中,我们有Windows照片查看器。而在Linux中,Shotwell是当今最流行的照片管理工具。它也是各种Linux发行版中默认内置的应用程序,当然Ubuntu也是这样内置的。和GIMP不同的是,Shotwell是一个轻量级应用,但也提供了一些最基本的编辑功能。
Shotwell的一个很好的替代品是gThumb

Linux中用于处理原生照相机图像的应用

由于数码单反相机价格的下降,(业余)摄影师的数量也以同比例增长。由于许多数码单反相机使用原生格式存储图像,像Shotwell这样的默认的图像查看器就不能处理这些图像了,也因此像digiKam这样的应用程序就应运而生了。作为一个开源软件,digiKam可以让你以专业方式处理高端相机图像。你可以使用digiKam来查看、管理、编辑、增强、组织图像,可以给图像贴标识,也可以分享图像。
digiKam的另一个替代品是GTKRawGallery,该软件也关注对照相机图像的处理。

Linux中的绘图应用

如果你正在寻找微软画图的Linux替代品,那么我选择Paint。你可以用该软件做一些像文本注解、画圆圈这样的编辑,你可以使用铅笔、画笔和喷枪来画图。在Ubuntu中,你可以从Ubuntu软件中心安装该软件。
Pinta的另一个替代品是Krita,该软件更强大,提供了更多的功能。比画图应用好,但还比不上GIMP。

Linux中像Instagram一样的应用

最后,让我们来讨论一下图像美化吧。在移动设备上,我们有许多复古的图像效果,但桌面平台中却没有。要在Linux中应用Instagram一样的效果,据我所知只有XnRetro,它能巧妙地进行处理。推荐你阅读如何在Ubuntu中使用XnRetro这篇文章来获取更多信息。
以上只是编排列出了Ubuntu以及其它Linux发行版中可用的各类图像应用软件,但这不是一个这类应用程序的完整列表。事实上,还有很多同类软件,我只是列出了个类目中最好的。
你认为呢?你也使用其它一些应用程序来完成特定的工作?能和我们分享你的看法吗?
原文地址

20个最受欢迎的Linux命令

本文根据commandlinefu网站的历史排名,筛选出了前20个得票最高的Linux命令。看看你都能熟练使用了吗?

1. 以 root 帐户执行上一条命令

  1. sudo !!

2. 利用 Python 搭建一个简单的 Web 服务器

可通过 http://$HOSTNAME:8000访问

  1. python -m SimpleHTTPServer

3. 切换到上一次访问的目录 

  1. cd –

4. 将上一条命令中的 foo 替换为 bar,并执行 

  1. ^foo^bar

5. traceroute + ping   

  1. mtr google.com

6. 快速调用一个编辑器来编写一个命令

  1. ctrl-x e

7. 执行一个命令,但不保存在命令历史记录中

  1. <space>command

8. 重新初始化终端

  1. reset

9. 调出上次命令使用的参数

  1. ‘ALT+.’ or ‘<ESC> .’

10. 以更加清晰的方式显示当前系统挂载的文件系统

  1. mount | column -t

11. 在给定的时间执行命令

  1. echo “ls -l” | at midnight

12. 通过DNS控制台查询维基百科

  1. dig +short txt <keyword>.wp.dg.cx

13. 从80端口向你本地的2001端口开启隧道

  1. ssh -N -L2001:localhost:80 somemachine

14. 快速访问ASCII表 

  1. man ascii

15. 获取你的外部IP地址

  1. curl ifconfig.me

16. !! 表示重复执行上一条命令,并用 :gs/foo/bar 进行替换操作

  1. !!:gs/foo/bar

17. 输出你的麦克风到远程机器的扬声器

  1. dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

18. 挂载一个临时的内存分区

  1. mount -t tmpfs tmpfs /mnt -o size=1024m

19. 以SSH方式挂载目录/文件系统

  1. sshfs name@server:/path/to/folder /path/to/mount/point

20. 通过curl更新Twitter

  1. curl -u user:pass -d status=”Tweeting from the shell” <a href=”http://twitter.com/statuses/update.xml”>http://twitter.com/statuses/update.xml</a>

原文地址

如何在centos6.5下安装redis

Redis是一种高级 key-value 数据库。它跟 memcached 类似,不过数据可以持久化,而且支持的数据类型很丰富。它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数 据库和键值数据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序 (SORT)等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。Redis可以被看成是一个 数据结构服务器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
本文,散仙将介绍下,如何在centos6.5下安装redis,具体的几个步骤如下:

序号 说明
1 去redis官网下载安装包 http://redis.io/download 或者使用wget http://download.redis.io/releases/redis-2.8.9.tar.gz
2 上传到centos下,并解压,增加权限,tar xzf redis-2.8.9.tar.gz
3 进入redis根目录,执行make命令,cd redis-2.8.9 ,make
4 进入src/目录下,执行./redis-server启动服务端

按照上面的几个步骤,我们可以正常的启动redis服务了
,然后我们执行ps -ef | grep redis 就可以看见redis的运行的进程了

然后我们就可以启动redis自带的客户端,访问redis,进行数据测试了.

OK,如果在Linux上,测试成功,下一步,我们就可以在我们的Java程序里面进行测试了,Redis支持多种客户端语言访问,对于Java的访问接口,使用的是Jredis,散仙在后面会上传该jar包,有需要的朋友可以下载。
下面我们看下,如何在Java中,实现的Redis的连接调用。

现在,我们在JAVA中也测试通过了,如果发现连接超时,有可能是我们的防火墙,阻挡了通讯连接,我们开放redis的端口号即可,或者关闭防火墙进行测试。

JAVA执行shell命令小工具

在我们的项目中,大部分环境的服务器用的都是Linux,从而使用JAVA与Linux shell通讯,就成了一项很常见的事情。
Ganymed SSH是一个Java实现SSH的项目
Java 实现SSH协议的项目有很多,如JFTP,trilead SSH,JSCH,ganymed SSH等
下面我们主要说的是关于ganymed SSH的一些小使用。
Ganymed SSH-2 for Java是用纯Java实现SSH-2协议的一个项目。可以通过它直接在Java程序中连接SSH服务器,实现基于SSH协议的服务访问。 如远程命令执行和shell访问,本地和远程端口转发,本地数据流转发,X11转发,SCP,SFTP等功能。
散仙测试的demo如下:

package com.qin.shell;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.mortbay.log.Log;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class ExecShell{
  private String IP;//要远程登录的IP地址
  private String username;//用户名
  private String password;//密码
  public ExecShell(String IP, String username,String password){
    this.IP=IP;
    this.username=username;
    this.password=password;
  }
  //命令执行
  public boolean exec( String command ) throws InterruptedException{
    Log.info("command: "+command);
    boolean rtn = false;
    try {
      Connection conn = new Connection(IP);
      conn.connect();
      boolean isAuthenticated = conn.authenticateWithPassword(username, password);
      if (isAuthenticated == false){
        throw new IOException("Authentication failed.");
      }
      Session sess = conn.openSession();
      sess.execCommand(command);
      InputStream stdout = new StreamGobbler(sess.getStdout());
      BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
      InputStream stderr = new StreamGobbler(sess.getStderr());
      BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderr));
      String line = null;
      while ( (line = br.readLine())!=null )
      {
        Log.info("GanyMedUtil out> "+line);
      }
      while (true)
      {
        line = stderrReader.readLine();
        if (line == null)
          break;
        Log.info("GanyMedUtil out> "+line);
      }
      /* Show exit status, if available (otherwise "null") */
      Log.info("ExitCode: " + sess.getExitStatus()+" "+IP+":"+command);
      sess.close();
      conn.close();
      rtn = new Integer(0).equals(sess.getExitStatus());
      return rtn;
    }
    catch (IOException e)
    {
      Log.warn("Error ......................",e);
      e.printStackTrace();
      System.exit(2);
      return rtn;
    }
  }
  public static void main(String[] args) throws InterruptedException {
    ExecShell es = new ExecShell("192.168.75.130","root","dongliang");
    System.out.println("==========================================单个命令测试执行==========================================");
    es.exec("ls");//执行单行命令
    System.out.println("==========================================多个命令测试执行==========================================");
    es.exec("cd /root/apache-nutch-1.8/ && ls && date");//多个命令之间使用&&隔开
    //ganyMedUtil.execMoreShellCommand("");
    //ganyMedUtil.exec("ls");
  }
}

输出的内容如下所示:

2014-05-28 15:27:19.076:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2014-05-28 15:27:19.076:INFO::command: ls
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> 2
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> abc.txt
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> anaconda-ks.cfg
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-ant-1.9.2
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-ant-1.9.2-bin.tar.gz
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-nutch-1.8
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-nutch-1.8-src.zip
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> a.sh
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> bb.sh
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> b.sh
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> case.sh
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> cip.sh
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> c.sh
2014-05-28 15:27:19.454:INFO::GanyMedUtil out> date
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> d.sh
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> e.sh
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> f.sh
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia_20140327155418.zip
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-3.1.7-3.el6.rf.x86_64.rpm
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-devel-3.1.7-3.el6.rf.x86_64.rpm
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-gmetad-3.1.7-3.el6.rf.x86_64.rpm
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-gmond-3.1.7-3.el6.rf.x86_64.rpm
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-gmond-python-3.1.7-3.el6.rf.x86_64.rpm
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-web-3.1.7-3.el6.rf.x86_64.rpm
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> gg.sh
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> hadoop1.2
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> hadoop-1.2.0.tar.gz
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> installganglia.sh
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> install.log
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> install.log.syslog
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> jdk1.7
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> jdk-7u51-linux-x64.tar.gz
2014-05-28 15:27:19.455:INFO::GanyMedUtil out> jmxtrans-20121016.145842.6a28c97fbb-0.noarch.rpm
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> libconfuse-2.7-6.2.x86_64.rpm
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> libevent-2.0.21-stable
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> libevent-2.0.21-stable.tar.gz
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> memcached-1.4.15
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> memcached-1.4.15.tar.gz
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> my.sh
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> pp
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> solr-4.3.1.tgz
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> test.jar
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> test.py
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> zookeeper
2014-05-28 15:27:19.456:INFO::GanyMedUtil out> zookeeper.zip
2014-05-28 15:27:19.456:INFO::ExitCode: 0 192.168.75.130:ls
==========================================多个命令测试执行==========================================
2014-05-28 15:27:19.458:INFO::command: cd /root/apache-nutch-1.8/ && ls && date
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> bb.sh
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> build
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> build.xml
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> CHANGES.txt
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> conf
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> default.properties
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> docs
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> ivy
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> lib
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> LICENSE.txt
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> NOTICE.txt
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> README.txt
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> runtime
2014-05-28 15:27:19.789:INFO::GanyMedUtil out> src
2014-05-28 15:27:19.790:INFO::GanyMedUtil out> 2014年 05月 28日 星期三 23:27:19 CST
2014-05-28 15:27:19.790:INFO::ExitCode: 0 192.168.75.130:cd /root/apache-nutch-1.8/ && ls && date

能够在在应用程序中,执行shell脚本是非常有用的,我们可以自己写一个shell脚本,把多个shell命令,封装起来,然后执行一次shell即可。
(原文链接

linux下文件夹操作命令

linux下的文件夹操作,包括创建、删除、重命名等基本操作。
1、文件夹的创建,在当前test目录下创建一个名为itbuluoge的文件夹

[root@localhost test]# ls
[root@localhost test]#

从上面我们用ls命令可以看到,当前test目录下没有任何内容。

[root@localhost test]# mkdir itbuluoge
[root@localhost test]# ls
itbuluoge
[root@localhost test]#

使用mkdir可以创建文件夹,mkdir命令后面直接跟需要创建的文件夹
2、删除文件夹
如果文件夹是空的话,直接使用rm -R 文件夹名称就可以了。

[root@localhost test]# rm -R itbuluoge/
rm:是否删除目录 “itbuluoge”?y
[root@localhost test]# ls
[root@localhost test]#

如果文件夹非空的话,需要每个文件确认。

[root@localhost test]# ls
itbuluoge
[root@localhost test]# ls itbuluoge/
test.txt
[root@localhost test]# rm -R itbuluoge/
rm:是否进入目录”itbuluoge”? y
rm:是否删除普通空文件 “itbuluoge/test.txt”?y
rm:是否删除目录 “itbuluoge”?y

我们在itbuluoge中新建了一个文件test.txt,此时如果要删除的话,就需要跟着目录去删除每一个文件。
(原文地址)

Linux监控工具munin的安装和配置 – Ron Ngai

Munin 是用于 Linux 系统(也可以监控 windows 系统)的监控软件。 munin 除了可以监控系统的各项数值之外,最大的好处是可以自己编写插件自定义监控需要的数值。整个系统的架构简单明了,操作方便。如果是使用 Debian 或者 Ubuntu 安装,安装过程也非常简单。 munin 除了可以监控结果,也可以设置报警。对于我个人对性能测试的工作来说,是个非常好的工具。
1.  内容
munin 整个使用下来,篇幅会有点大,包括展示、自定义插件。这边分成三个部分来说明。本次只讲安装和配置。

    • munin master 和 munin-node 的安装;
    • web 服务展示结果和动态查看结果;
    • 插件编写与配置( mysql 插件与自定义插件)。

2.  架构示意图

munin 的架构非常简单。包含一个服务端 munin 和一个客户端 munin-node 。 munin-node 可以部署在多台机器上面, munin 用于定时向一台或者多台机器收集监控的信息。 munin 收集到数据后会生成静态的 html 文件。为了展示监控的结果,需要一个 web 服务器。有了 web 也可以随时随地访问监控结果。

一、 Ubuntu/Debian  下安装

在 Ubuntu/Debian 下安装非常简单。使用 apt-get 就可以直接安装好了。安装完了之后, Munin 和 Munin-node 会顺便启动的。
1. Munin node (客户端)

# apt-get install munin-node

2. Munin master (服务端)

# apt-get install munin

二、 Redhat 下安装

在红帽下安装就略显麻烦了。首先要把 rpm 的软件包下载下来。但是除了 Munin 和 Munin-node 的软件包,另外还涉及到 perl 的一些库。
另外, Redhat 下安装,不同版本的系统包,使用的软件包还不一样。我们使用的是 RHEL5 版本的,所以下面例子以 RHEL5 为准(官方给的资料在 RHEL5 下安装与 RHEL4 下安装的过程是一样的。只是每个可能软件包根据系统而不一样而已。这个直接替换掉最后的 rpm 为最新的版本号就好了)。
1. Munin node (客户端)
下载程序包:
Munin-node 包:

# wget http://dl.fedoraproject.org/pub/epel/5/i386/munin-node-2.0.20-1.el5.noarch.rpm

下载依赖包:

# wget ftp://195.220.108.108/linux/centos/5.10/os/x86_64/CentOS/sysstat-7.0.2-12.el5.x86_64.rpm
# wget http://dag.wieers.com/rpm/packages/perl-Net-SNMP/perl-Net-SNMP-5.2.0-1.2.el5.rf.noarch.rpm
# wget http://dag.wieers.com/rpm/packages/perl-Crypt-DES/perl-Crypt-DES-2.05-3.2.el5.rf.i386.rpm  ( perl-Net-SNMP 依赖此包)
# wget http://pkgs.repoforge.org/perl-Socket6/perl-Socket6-0.23-1.el5.rfx.x86_64.rpm  ( perl-Net-SNMP 依赖此包)
# wget http://pkgs.repoforge.org/perl-Net-Server/perl-Net-Server-0.99-1.el5.rf.noarch.rpm

可以使用以下顺序安装:

# rpm -Uvh sysstat-7.0.2-12.el5.x86_64.rpm
# rpm -Uvh perl-Net-Server-0.99-1.el5.rf.noarch.rpm
# rpm -Uvh perl-Socket6-0.23-1.el5.rfx.x86_64.rpm
# rpm -Uvh perl-Crypt-DES-2.05-3.2.el5.rf.i386.rpm
# rpm -Uvh perl-Net-SNMP-5.2.0-1.2.el5.rf.noarch.rpm
# rpm -Uvh munin-node-1.2.5-1rhel4.noarch.rpm (最后安装 Munin node )

即:
1:sysstat
2:perl-Socket6
3:perl-Crypt-DES
4:perl-Net-SNMP
5:perl-Net-Server
6:munin-node
如果遇到签名验证不通过的问题,可以加上 [–force –nodeps]  参数强制安装:

# rpm -Uvh perl-Net-SNMP-5.2.0-1.2.el5.rf.noarch.rpm --force --nodeps

以上顺利的话, munin-node 就安装好了。安装完毕后,系统会自动启动 munin-node 。
2. Munin master (服务端)
下载 Munin 包:

# wget http://dl.fedoraproject.org/pub/epel/5/i386/munin-2.0.20-1.el5.noarch.rpm

下载依赖包:

# wget http://dag.wieers.com/rpm/packages/perl-HTML-Template/perl-HTML-Template-2.8-1.2.el5.rf.noarch.rpm
# wget http://pkgs.repoforge.org/rrdtool/perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm
# wget http://pkgs.repoforge.org/rrdtool/tcl-rrdtool-1.4.7-1.el5.rf.x86_64.rpm
# wget http://dag.wieers.com/rpm/packages/perl-Net-SNMP/perl-Net-SNMP-5.2.0-1.2.el5.rf.noarch.rpm ( munin node 也用到)
# wget http://dag.wieers.com/rpm/packages/perl-Net-Server/perl-Net-Server-0.99-1.el5.rf.noarch.rpm ( munin node 也用到)

安装顺序:
1:perl-HTML-Template
2:rrdtool
3:perl-rrdtool
4:perl-Net-SNMP
5:perl-Net-Server
6:munin
以上, munin 的客户端和服务端都安装好了。如果安装期间遇到版本不对的地方,请根据自己的系统版本,自行替换为相应的依赖包。

三、配置和启动

无论是 Debian 下安装,还是 RedHat 下安装, munin-node 和 munin master (即 munin )都默认安装在路径 /etc/munin 下。配置文件与插件都是在这里配置的。
1. munin-node.conf (客户端配置)
1.1  配置文件
munin-node.conf 是客户端(即 munin-node )的配置文件。这边的配置比较简单,只需要配置服务器的 IP 地址就可以了。在 allow 新增一个服务器的 IP 配置。默认是配置了本机了,如果你的 munin-node 与 munin master 是在同一台机器上面,默认就可以了。这个配置是用来限制那些 IP 可以访问的。

allow ^127\.0\.0\.1$
allow ^::1$
allow ^192\.168\.1\.2$

另外还可以修改端口、绑定 IP 地址等。都比较简单,就不多说了。
1.2  启动、停止和重启
启动程序是 /etc/init.d/ 下的 munin-node 可执行文件。也可以直接以服务的形式启动。

# service munin-node start        #启动
# service munin-node stop        #停止
# service munin-node restart     #重启

1.3  测试
直接 telnet 就可以。端口默认是配置为 4949 的,那么 telnet 连接,输入 help 可以查看监控命令。

$ telnet 127.0.0.1 4949
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
# munin node at machinename
help
# Unknown command. Try cap, list, nodes, config, fetch, version or quit

2. munin.conf
2.1  配置
munin.conf 是服务端(即 munin master )的配置文件。
首先去掉一下路径配置的注释。除了 tmpldir ,其它可自行配置。但是 tmpldir 要配置到 munin 的 HTML 模板上,默认是在 /etc/munin/templates  下。基本上都有说明,还是比较容易看得懂的。

dbdir   /var/lib/munin
htmldir /var/cache/munin/www
logdir /var/log/munin
rundir  /var/run/munin
tmpldir /etc/munin/templates

然后找到 localhost.localdomain 节点。这个是用于配置需要监控的目标机器的。默认会配置本机 127.0.0.1 。根据需要,可新增需要监控的机器。可以增加多台机器,只要目标机器安装了 munin-node 就可以。如:

# a simple host tree
[local.127-0-0-1]
  address 127.0.0.1
  use_node_name yes
[mytest.192-168-1-3]
  address 192.168.1.3
  use_node_name yes
[mysql.192-168-1-4]
  address 192.168.1.4
  use_node_name yes

2.2  启动
munin master 安装成功后。会给系统增加一个 munin 用户。启动服务端( munin master )是无法用 root 权限启动的,只能使用 munin 用户启动。当然安装的时候,会默认自己启动的。并且会每隔 5 分钟,会定时执行 munin-cron 定时任务。基本上,修改完配置表后可以完全不用理会,等待服务端自己去更新即可。
当然如果你一定要马上更新,可以切换到 munin 用户,执行 munin-cron 命令。

# su munin -c /etc/init.d/munin-cron

执行无报错的话,是没有打印信息的。
3  测试
在 munin.conf  配置文件里面指定了生成的监控的 html 监控结果“ htmldir /var/cache/munin/www ”。只需要配置一个 web 服务器,可访问到目标路径“ /var/cache/munin/www ”即可。可以使用 nginx 、 apache 、 resin 等主流 web 服务器。 html 都是静态文件,所以任何 web 服务器都是可以的。
访问 web 服务器,就可以查看结果了。

四、参考资料

官方安装说明: http://munin-monitoring.org/wiki/MuninInstallationLinux
原文:http://www.cnblogs.com/rond/p/3757804.html