Press "Enter" to skip to content

月度归档: 2014年11月

Linux执行usermod时提示user xxx is currently logged in问题

近日遇到一怪事,执行usermod更改用户家目录时,被提示usermod: user xxx is currently logged in,可是用户根本没有登陆到系统里啊。查了下,网上普遍的解决方法是备份以后清空/var/run/utmp文件,再重启以后就好了。可说的容易,服务器哪是想重启就重启的?

$ usermod -d /some/opther/path userfoo
usermod: user userfoo is currently logged in

$ who
myuser  pts/0        2013-06-17 11:29 (1.2.3.4)

$ ps aux | grep userfoo
root  16724  0.0  0.0 103236   884 pts/0    S+   11:36   0:00 grep userfoo

根本原因:chmod是根据lsof判断用户是否已经logged in的。通过lsof找出“正在登陆”的用户,kill掉相关进程就可以了。

$ lsof | grep userfoo
dbus-daem 29904       userfoo  cwd   unknown    /proc/29904/cwd (readlink: Permission denied)
dbus-daem 29904       userfoo  rtd   unknown    /proc/29904/root (readlink: Permission denied)
dbus-daem 29904       userfoo  txt   unknown    /proc/29904/exe (readlink: Permission denied)
dbus-daem 29904       userfoo NOFD              /proc/29904/fd (opendir: Permission denied)
dbus-daem 31889       userfoo  cwd   unknown    /proc/31889/cwd (readlink: Permission denied)
dbus-daem 31889       userfoo  rtd   unknown    /proc/31889/root (readlink: Permission denied)
dbus-daem 31889       userfoo  txt   unknown    /proc/31889/exe (readlink: Permission denied)
dbus-daem 31889       userfoo NOFD              /proc/31
Leave a Comment

Ubuntu系统下查看硬盘信息

Ubuntu系统下查看硬盘信息的方法,可以查看到硬盘的型号、序列号、接口类型,转速,缓存等,这里记录一下。

方法一:直接通过内核查看

$ cat /sys/block/sda/device/model
ST31000524AS

$ cat /sys/block/sda/device/vendor 
ATA

方法二:用过hdparm命令查看

$ sudo hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
	Model Number:       ST31000524AS                            
	Serial Number:      9VPF38YC
	Firmware Revision:  JC45    
	Transport:          Serial, SATA Rev 3.0
Standards:
	这里省略大量信息
Configuration:
	Logical		max	current
	cylinders	16383	16383
	heads		16	16
	sectors/track	63	63
	--
	CHS current addressable sectors:   16514064
	LBA    user addressable sectors:  268435455
	LBA48  user addressable sectors: 1949396401
	Logical/Physical Sector size:           512 bytes
	device size with M = 1024*1024:      951853 MBytes
	device size with M = 1000*1000:      998090 MBytes (998 GB)
	cache/buffer size  = unknown
	Nominal Media Rotation Rate: 7200
Capabilities:
	LBA, IORDY(can be disabled)
	这里省略大量信息
Commands/features:
	Enabled	Supported:
	   *	SMART feature set
	    	Security Mode feature set
	   *	这里省略大量信息
	   *	SCT Data Tables (AC5)
Security: 
	Master password revision code = 65534
		supported
	not	enabled
	not	locked
		frozen
	not	expired: security count
		supported: enhanced erase
	164min for SECURITY ERASE UNIT. 164min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 5000c5003fc5c146
	NAA		: 5
	IEEE OUI	: 000c50
	Unique ID	: 03fc5c146
Checksum: correct
2 Comments

Ubuntu的包管理方式简介(apt-get、dpkg、aptitude)

因为工作的关系,刚从CentOS换到Ubuntu,需要对Ubuntu系统有一些了解。因此便有了本文。

apt-cache search package    #搜索包(相当于yum list | grep pkg)
apt-cache show package      #显示包的相关信息,如说明、大小、版本等
apt-cache showpg package    #显示包的相关信息,如Reverse Depends(反向依赖)、依赖等
apt-get install package       #安装包
apt-get reinstall package     #重新安装包
apt-get -f install package    #强制安装
apt-get remove package        #删除包(只是删掉数据和可执行文件,不删除配置文件)
apt-get remove --purge package       #删除包,包括删除配置文件等
apt-get autoremove --purge package   #删除包及其依赖的软件包+配置文件等
apt-get update          #更新源
apt-get upgrade         #更新已安装的包
apt-get dist-upgrade    #升级系统
apt-get dselect-upgrade        #使用 dselect 升级
apt-cache depends package      #了解使用依赖
apt-cache rdepends package     #查看该包被哪些包依赖
apt-get build-dep package   #安装相关的编译环境
apt-get source package      #下载该包的源代码
apt-get clean && apt-get autoclean  #清理下载文件的存档 && 只清理过时的包
apt-get check             #检查是否有损坏的依赖
dpkg -S filename          #查找filename属于哪个软件包
apt-file search filename  #查找filename属于哪个软件包
apt-file list packagename #列出软件包的内容
apt-file update           #更新apt-file的数据库
dpkg -l      #列出当前系统中所有的包.可以和参数less一起使用在分屏查看(类似于rpm -qa)
dpkg -l |grep -i "pkg"   #查看系统中与"pkg"相关联的包(类似于rpm -qa | grep pkg)
dpkg -s pkg  #查询一个已安装的包的详细信息(类似于rpm -qi)
dpkg -L pkg  #查询一个已安装的软件包释放了哪些文件(类似于rpm -ql)
dpkg -S file     #查询系统中某个文件属于哪个软件包(类似于rpm -qf)
dpkg -c pkg.deb  #查询一个未安装的deb包将会释放哪些文件(类似于rpm -qpl)
dpkg -I pkg.deb  #查看一个未安装的deb包的详细信息(类似于rpm -qpi)
dpkg -i pkg.deb  #手动安装软件包(不能解决软依赖性问题,可以用apt-get -f install解决)
dpkg -r pkg      #卸载软件包(不是完全的卸载,它的配置文件还存在)
dpkg -P pkg      #全部卸载(不能解决依赖性的问题)
dpkg-reconfigure pkg     #重新配置
dpkg -x pkg.deb dir      #将一个deb包解开至dir目录
dpkg --pending --remove  #移除多余的软件
Leave a Comment

Ubuntu系统更改CPU频率

在Ubuntu 12.04系统上更改CPU频率,涉及到的内核参数值为scaling_governor

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 
performance

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 
conservative ondemand userspace powersave performance 

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 
3101000 3100000 2900000 2700000 2500000 2300000 2100000 1900000 1700000 1600000 
sudo apt-get install cpufrequtils

相关参数
$ cpufreq-selector -h
  -c, --cpu           CPU Number
  -g, --governor      Governor
  -f, --frequency     Frequency in KHz

试着调整一下
$ sudo cpufreq-selector -c 0 -g performance

看看结果
$ cat /proc/cpuinfo | grep MHz
cpu MHz		: 3101.000
cpu MHz		: 1600.000
cpu MHz		: 1600.000
cpu MHz		: 1600.000

设置开机自动调整
$ sudo vim /etc/rc.local     #加入如下四行
sudo cpufreq-selector -c 0 -g performance
sudo cpufreq-selector -c 1 -g performance
sudo cpufreq-selector -c 2 -g performance
sudo cpufreq-selector -c 3 -g performance

万恶的Ubuntu,竟然不支持sudo echo xx > file。

2 Comments

CentOS 6安装配置LDAP

一,什么是LDAP

随着全国信息化建设的不断深入,各企事业单位都陆续开发出了针对本单位实际应用的多个管理信息系统。但各应用系统的开发大多沿袭传统的开发模式,即每个应用系统都有各自独立的用户认证模块,并使用独立的认证机制在各自的数据库中进行用户认证。这种用户认证模式有很多弊端:
1,传统的开发模式大多是基于关系数据库的用户认证信息管理模型,读取速度慢,可移植性差;
2,用户在每个应用系统中都必须存储用户名和密码等认证信息,这样会使用户认证信息在多个应用系统的数据库中重复放置,造成大量的数据冗余;
3,这种认证模式给用户认证信息的维护管理和用户的使用造成诸多不便。例如,用户需要更改自己的认证信息时,就必须逐个在所有的应用系统中进行更改,若有遗漏,就会造成数据的不一致;
4,每个应用系统都必须有各自独立的用户认证模块,这将造成重复开发;
5,由于没有单点登录功能,用户在使用不同的应用系统之时,必须重复登录。
基于以上几点,不难发现,传统开发模式的诸多弊端已经严重影响了WEB应用系统的性能和使用的方便性。

二,LDAP目录服务简介

目录服务是一种专门的数据库,可以用来保存描述性的、基于属性的信息,就像大多数人熟悉的各种各样的目录,像电话簿、黄页,电视指南、购物目录和图书馆卡片目录。听起来像是数据库一样,但“目录”与数据库并不相同,目录的大部分操作为读操作,可以针对大量的查找或者搜索操作进行快速的响应。它们可以具有大范围复制信息的功能,以便提高可用性和可靠性,同时缩短响应时间。

假如你的应用程序要写入大量的数据,你应该考虑选择使用数据库来实现。目录仅支持相对简单的事务处理。相反,数据库被设计成处理大量的各种各样的事务处理。假如你的应用要求这种重负荷的事务支持,你该选择数据库而不是目录。在另一方面,假如你的应用不要求这样的大负荷事务处理,而是偶尔的写一些简单的事务信息。这时,目录是理想的选择。它会更有效,更简单。

Leave a Comment

Linux Shell之数组

一,数组定义

定义方法1
arr=(1 2 3 4 5) #用空格分开

定义方法2
array
array[0]="a"
array[1]="b"
array[2]="c"

定义方法3
str=“a b c”
array=($str)

二,数组调用及遍历

${#array[@]}      #获取数组的长度
echo ${array[@]}  #遍历数组(输出数组全部元素)
array[0]=5        #向数组的某个元素赋值
echo ${array[@]:1:2}  #输出array[0]和array[1]的值
echo ${array[@]:2}    #输出数组第三个元素以后的值
echo ${array[@]::2}   #输出数组下标小于2的值
$ echo ${#array[3]}   #取得元素3的长度
unset array    #清除array
array=         #清空array的值


遍历(For循环法)
for i in ${arr[@]}
do
    echo $i
done

遍历(For循环法2)
for ((i=0;i<${#array[@]};i++))
do
   echo ${array[$i]}
done

遍历(while循环法)
len=${#arr[@]}
i=0
while [ $i -lt $len ]
do
echo ${arr[$i]}
let i++
done

每隔30秒,查找名为ndh2nds的进程,找出其pid,修改/proc/$pid/oom_score_adj的值,防止该进程被OOM机制杀掉

#!/bin/bash

while :
do
  list=`ps -ef | grep -i ndh2nds | grep -v 'grep ' | awk '{print $2}'`
  array=($list)
  for pid in ${array[@]}
  do
    score=`cat /proc/$pid/oom_score_adj`
    echo oom_score_adj of pid $pid is $score
    if [ $score -ge 0 ]; then
      echo -100 > /proc/$pid/oom_score_adj
      echo changed oom_score_adj of pid $pid to `cat /proc/$pid/oom_score_adj`
    fi
  done
sleep 30
done
Leave a Comment

Linux Shell之括号用法

一,单小括号()
1,命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
2,命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
3,用于初始化数组。如:array=(a b c d)

二,双小括号(( ))
1,整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是”假”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。
2,只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
3,单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
4,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。

#判断大小
if ($i<5)  
if [ $i -lt 5 ]  
if [ $a -ne 1 -a $a != 2 ]  
if [ $a -ne 1] && [ $a != 2 ]  
if [[ $a != 1 && $a != 2 ]]  

#输出数0到4  
for i in $(seq 0 4);do echo $i;done  
for i in `seq 0 4`;do echo $i;done  
for ((i=0;i<5;i++));do echo $i;done  
for i in {0..4};do echo $i;done  
Leave a Comment