I can believe fly.

Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

Tuesday, December 28, 2010

使用subprocess.Popen,程序block问题处理

使用subprocess.Popen,程序block问题处理

问题:

 脚本运行中,执行sudo strace svnadmin,出现卡死现象,一直保持如下信息不动:

 getcwd("/home/ysl/svn-repo-bak"..., 4098) = 28

 write(2, "* Dumped revision 2769.\n", 24

分析:

jessinio: jobs有什么呢

: 没东西

jessinio: 终端是不是和你运行SvnDumpBak.py是同一个?

: 不是,我又另外打开了一个

jessinio: 呃。。。车子不同, 你查个刹车 没有意义

: 那我要在执行命令那里,ctrl z掉,让它在后台跑?

jessinio: ctrl z 然后bg

: [ysl@svn-repo-bak]$ bg

[1]+ sudo python SvnDumpBak.py yslProR &

[[ysl@svn-repo-bak]]$ jobs

[1]+ Running sudo python SvnDumpBak.py yslProR &

 

jessinio: ps auxwww|grep strace

: [[ysl@svn-repo-bak]]$ ps auxwww|grep strace

ysl 10851 0.0 0.0 61144 728 pts/0 S+ 14:45 0:00 grep strace

root 31108 2.2 0.0 4112 632 pts/1 S+ 14:31 0:17 strace -p 17686

jessinio: 还有一个strace

: 我打另一个连接,在跑strace来看,刚还有信息在更新。现就卡着了

jessinio: 你把strace停了

: ctrl c??

: 停了

 

jessinio: ps auxwww|grep 7z

: root 17687 85.5 4.9 233772 199576 pts/0 Sl 14:15 27:37 /usr/local/p7zip_9.13/bin/7z a -si /data/backup/svnRepo//20101227/yslProR.full20101227.dump -pNBc5RB!

jessinio: strace -p 17687

: [[ysl@svn-repo-bak]]$ sudo strace -p 17687

Process 17687 attached - interrupt to quit

[ Process PID=17687 runs in 32 bit mode. ]

futex(0x86b54ac, FUTEX_WAIT_PRIVATE, 1366961, NULL

jessinio: top -p 17687

: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

17687 root 15 0 228m 194m 1856 S 0.0 4.9 27:37.96 7z

jessinio: 变化 不?

: TIME+下的数据没变啊

jessinio: 还是没有变?

: 没,还是 27:37.96

jessinio: ps auxwww|grep svnadmin

: root 17686 2.4 2.5 205868 103152 pts/0 S 14:15 1:10 svnadmin dump /storage/repool/yslProR -r 0:4855

jessinio: 你的代码应该有问题。

: 可是小的仓库为什么没问题呢

jessinio: buffer没有满呀

结论:

    同事帮忙分析是由于buffer满导致,检查了程序,原版:

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    p.wait()

    # command exec error,print detail info

    if p.returncode:     

        write_log(p.stdout.read())

    return p.returncode

    也就是说没有处理输出数据,而pipe容量有限的。如果满了将会block或者fail。信息如下:

Pipe Capacity

      A pipe has a limited capacity.  If the pipe is full, then a write(2) will block or fail, depending on whether the  O_NONBLOCK

      flag  is  set  (see  below).

解决:调整脚本,增加了一个变量来读取PIPE里的输出数据

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    retval = p.stdout.read()

    p.wait()

    # command exec error,print detail info

    if p.returncode:     

        write_log(retval)

    return p.returncode

资料:   

    subprocess模块:http://docs.python.org/library/subprocess.html


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

svnadmin dump | 7z命令执行失败

svnadmin dump | 7z命令执行失败

问题:

7-Zip 9.13 beta  Copyright (c) 1999-2010 Igor Pavlov  2010-04-15

p7zip Version 9.13 (locale=C,Utf16=off,HugeFiles=on,2 CPUs)

Compressing  [Content]

System error:

Operation not permitted

svnadmin: Can't write to stream: Broken pipe

疑问:为什么小仓库dump,7z压缩正常,而大的仓库就会报类似以上的错误?

分析:

1. 执行mount,获取分区信息

2. 执行df -h,获取硬盘大小信息

3. 检查引发错误的的执行命令行是否有问题

svnadmin dump /storage/yslProR -r 0:1000 | /usr/local/p7zip_9.13/bin/7z a -si /data/space/svndumpbak/20101229/yslProR.full20101229.dump -p2048密码

结论:

   1.问题是由于空间不足引发的,其中/data目录的空间占用100%,信息如下:

     /dev/mapper/VolGroupData-LogVolData   10G   10G   74M 100% /data

   2.而引发空间不足,又是由于/data/space的空间没mount成功导致的。

解决:

    1.重新mount备份存储空间

      mount -t nfs 192.168.5.5:/data/space/ /data/space/

    2.为避免机子重启,mount空间失效,则请将以上mount命令加入/etc/rc.local


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Linux下scp密钥问题

需求A机往Bscp操作

事件:要求运维的系统管理员给配个密钥,把公钥分配给B机。原以为他把公钥让我扔给B机的主人,而私钥他会配好,结果啥也没做, 啥也没配,也没说。结果,我杯剧:

情景

SSHA机,scp数据时出现如下错误:

Permission denied (publickey,gssapi-with-mic).

lost connection

咨询了一下,私钥放在哪。答案:本地(A)没放。好吧,我认,自个动手把私钥cpA机的某目录下如/home/ysl/cfg/ysl_key,并更改文件的权限:chmod 0600 /home/ysl/cfg/ysl_key

继续试着执行scp操作:

scp -r /data/tempdir/20101025 -i /home/ysl/cfg/ysl_key ysl@5.5.5.5:/data/ysldata

结果错误信息仍然存在。

那么,试着SSH一下:

ssh -i /home/ysl/cfg/ysl_key ysl@5.5.5.5: "ls -ld /data/ysldata"

很好,有正常信息出现,那为什么scp不行??

试着在scp时打印出相关日志,执行:

scp -vvv /data/tempdir/20101025/file -i /home/ysl/cfg/ysl_key ysl@5.5.5.5:/data/ysldata

日志中发现-i指定私钥不被识别,只会在当前账号的根目录去找/home/ysl/.ssh/id_rsa

继续试着执行cp /home/ysl/cfg/ysl_key /home/ysl/.ssh/id_rsa

然后重新scp操作,发现正常了。

结论

据同事给出scp的手册中说明-i identity_file的信息:

Selects the file from which the identity (private key) for RSA authentication is read. This option is directly passed to ssh(1).

相当于说-i是指定使用RSA的私钥。上面用到的私钥/home/ysl/cfg/ysl_key并不是RSA格式的,因此无效。

解决

1. 更找密钥,生成RSA格式的

2. 以某个要执行scp动作的账号按以下步骤操作(elian)

mkdir /elian/.ssh

chmod 0700 /elian/.ssh

cp /home/ysl/cfg/ysl_key /elian/.ssh/id_dsa

chown -R root:root /elian/.ssh

chmod 0600 /elian/.ssh/id_dsa



--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Tuesday, December 21, 2010

SVN命令行:error while loading shared libraries

错误类似信息:

svnlook: error while loading shared libraries: libsvn_repos-1.so.0: cannot open shared object file: No such file or directory

 

以下是本人在执行脚本报如上错误时,查找原因的步骤信息

1.执行ldd $(which svnlook),获取含有so.0:文件的信息(文件存在,为何还报错呢?)

libsvn_repos-1.so.0 => /usr/local/lib/libsvn_repos-1.so.0 (0x00002b0260dd2000)

2. 接着试单独执行svnlook ......,结果是正常使用的;

3. 继续执行了whereis svnlook ,得出以下两个路径:

usr/bin/svnlook usr/bin/local/svnlook

4. 紧接,试着单独执行usr/bin/svnlook,结果报了一样的错误(注:脚本带有/usr/bin/env,因此脚本运行时也是使用这路径的命令)

5. 执行ldd /usr/bin/svnlook,需要的文件真的是找不到 

libsvn_repos-1.so.0 => not found

libsvn_fs-1.so.0 => not found

libsvn_fs_fs-1.so.0 => not found

libsvn_fs_base-1.so.0 => not found

libsvn_delta-1.so.0 => not found

libsvn_diff-1.so.0 => not found

libsvn_subr-1.so.0 => not found

 

结论usr/bin/svnlook该路径的命令有问题

处理:

a.安全起见,备份下原来的

mv /usr/bin/svnlook /usr/bin/svnlook_back

b.重新ln一份正常的

ln -s /usr/local/bin/svnlook /usr/bin/svnlook


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Linux/win下共用正则表达式,获取干净的md5值

linuxwin下执行完md5命令后,各自返回的信息格式有出入,作下记录:

[yusulian@wol-svn-svr0 ysltest]$ md5sum /data/backup/20101217/dop.full20101217.dump

b5952f4f489e9db46115425f01408343  /data/backup/20101217/dop.full20101217.dump

 

E:\WorkDir\yusulian\>D:\soft\too\md5\md5sum.exe E:\WorkDir\temp\svndump\20101217\R0.full20101217.dump

\98b8f16be45b07e64b1dceff19b6a3aa *E:\\WorkDir\\temp\\svndump\\20101217\\R0.full20101217.dump

 

给出共用的正则表达式,获取干净的md5值:

regStr = r"(\\|)(.*)(  | \*)(.*)"

md5Value = re.match(regStr, md5Result).group(2)

return md5Value


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Tuesday, March 24, 2009

linux's smb配置

引言:自己动手才是王道,下面是简单的配置,贴出来作个记录

1. 安装smb
# /etc/init.d/smb start 
启动后用如下命令查看samba服务器所用的端口,并在防火墙中把相应的端口打开:
# netstat -tlnp |grep smb

2. 编辑配置文件
# vi /etc/samba/smb.conf
{
smb的配置信息(基本参考)
[global]
workgroup = ysl [工作组名称]
netbios name = yusulian  [主机名称]
server string = Samba Server Version %v [smb服务说明信息]
security = user [级别可以是user即需要用户才能访问;share是不用账号直接可以访问的]
display charset = cp936 [编码设置,这是为了win机子访问时,正常显示中文目录而设置]
unix charset = cp936
dos charset = cp936
[smbdir] [共享目录,外部访问的根目录]
comment = smb dir test [共享目录说明]
path = /data/smb/smbdir [共享目录绝对路径]
read list = test [只读权限账号列表,逗号隔开]
write list = admin [可写权限账号列表,逗号隔开]
create mask = 0775 
directory mask = 0775 
writable = yes 

3. 同步系统账号
# cat /etc/passwd | mksmbpasswd.sh > /etc/samba/smbpasswd
# vi /etc/samba/smbpasswd  (去掉多余的账号)

4. 修改smb密码(smb虽然用了系统账号,但不共用密码,因此需要作下调整)
# smbpasswd 账号   //为系统用户设置smb口令
5.smb服务重启
# service smb restart 

ps.其它补充说明
1. smb三种权限:read list,write list ,admin

Wednesday, March 11, 2009

linux下执行mount问题

  上回在linux下执行mount,出现中文目录问题,后面加了iocharset=cp963参数搞定,命令是:
sudo mount -t cifs -o iocharset=cp963,username=user,password=pwd //192.168.0.0/Backup /data/mnt/samba
  今天继续执行copy动作:cp -rf /data/mnt/samba/src /data/dst,却出现如下错误:
cp: cannot stat `/data/mnt/samba/src/\324\317\302\311\316\350台.bmp': No such file or directory
  疑问:/src目录下有5个中文名称的文件,为什么有四个可以正常copy到dst目录下,只有一个怎么也不过去.

  后面,先umount掉,继续重新执行:
sudo mount -t cifs -o codepage=936,iocharset=uft8,username=user,password=pwd //192.168.0.0/Backup /data/mnt/samba
  这时候来查看中文目录,显示全变成了乱码了,就把iocharset=uft8改为iocharset=gb2312来执行
显示是正常的,但copy的问题还是存在着.

.........中间让朋友帮上去服务器分析一下,他查了一下那目录是什么编码..................
  后面发现在重新执行以上任何mount的动作,都成功不了,总是报如下两种错误:
mount error 20 = Not a directory
(网上资料是说可以执行echo 0 > /proc/fs/cifs/LinuxExtensionsEnabled,好像在这边没效果)
mount error 79 = Can not access a needed shared library
(这个问题更是一头雾水)

继续寻找原因,朋友试着将-t cifs改为-t smbfs,命令:
sudo mount -t smbfs -o iocharset=cp963,username=user,password=pwd //192.168.0.0/Backup /data/mnt/samba
成功执行,但是无论iocharset=cp963采用什么编码,都显示乱码,根本无法copy操作

补充:
1.重新换个目标挂载目录/data/mnt/samba改为/data/mnt/test,问题还是存在
2.执行sudo reboot,重启电脑,也没有解决

Thursday, March 5, 2009

python编码知识

事件
file1[utf-8]->file2[gbk],从file1读取的数据类型type(数据)是str类型
这时候,如果要将该数据以gbk编码写入file2,则需要作转换:
        var = unicode(var, 'uft-8').encode('gbk')
相反的需求:
        var = unicode(var, 'gbk').encode('uft-8') 
你也可以写个unicode检测信息
        # 检测,如果var不是unicode,则相应转换
        if not isinstance( var, unicode): 
            try:
                var = var. decode ("utf-8", 'ignore')
            except:
                var = var. decode ("gbk", 'ignore')
问题现象
(编码转换过程中经常会有以下的错误提示)
Errors: 'ascii' codec can't encode characters in position 26-27: ordinal not in range(128)
Errors: 'gbk' codec can't encode character u'\u036c' in position 26: illegal multibyte sequence
知识点
decode 解码,将指定的编码转换为unicode
格式:decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?取代非法字符;
如果设置为xmlcharrefreplace,则使用XML的字符引用。
例子:
var. decode ("gbk") var为gbk编码,转为unicode. (同等式=unicode(var,"gbk"))
var. decode ("gbk", 'ignore') var为gbk编码,转为unicode. 忽略非法字符
encode 编码,将unicode解为指定的编码
var.encode('gbk')
如果两个编码需要转换,则:unicode(a, 'gbk').encode('utf-8')
先将gbk编码转为unicode,然后在转为utf-8
关键
你要清楚接收的数据原编码是啥,最终又是以什么目标编码存储。]
实例
命令行:cmd = E:\WorkDir\yusulian\2009\ver_manage\dirrepo\Case2\DubaRelease\2009\copysharedata.bat \\192.168.11.22 ysl ysl 版本\公测 20081104.13586 standard\beta
执行: os.system(cmd)
出错:
   File "getdata.py", line 61, in getdata
    os.system(cmd)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 114-117:
解决:
先把cmd转为unicode
if not isinstance( cmd, unicode): 
    try:
        cmd = cmd. decode ("utf-8")
    except:
        cmd = cmd. decode ("gbk")

执行的时候, 把cmd转为gbk/utf-8编码
os.system ( cmd. encode("gbk") )
或者
os.system ( cmd. encode("utf-8") )
相关资讯


Thursday, February 26, 2009

wget使用经验

使用wget命令,取远程数据,远程有几层目录,在本地就会跟着创建.
如,执行wget -c -r -np -nH ftp://192.168.11.10/public/yusulian/ysl/20090225
==>结果会在本地跟着创建public/yusulian/ysl/20090225
有一个--cut-dirs=NUMBER 参数,即忽略远程目录的层数,
1. 如果是手工执行的时候,你可以自觉的写上要忽略的层数
如,执行wget -c -r -np -nH --cut-dirs=3 ftp://192.168.11.10/public/yusulian/ysl/20090225
==>结果在本地只会创建20090225,把前三层忽略了.
2. 如果是想写脚本自动跑,由于不同的url,目录层级可能不同
你只能在脚本外层,除了初始化url,也需要加上每个url要忽略的目录层数

ps:误区
有人提醒说,把-cut-dirs设为10000,反正目录不为这么多
结果,试了一下才发现,这不是把子目录也给忽略掉了嘛.





Tuesday, January 13, 2009

redhat8装SVN工具

[root@DB-RH8-x86 root]# rpm -q apr
apr-0.9.5-0.2
[root@DB-RH8-x86 root]# rpm -q apr-util
apr-util-0.9.12-2
[root@DB-RH8-x86 root]# rpm -q neon
neon-0.24.7-1
[root@DB-RH8-x86 root]# rpm -q subversion
subversion-1.3.2-1
不要装apr-0.9.12-2.i386.rpm. 装apr-0.9.5-0.2.i386.rpm就可以了.

 * 以上是同事在redhat8装SVN工具 正常的版本组合,参考了

Tuesday, January 6, 2009

linux定时启动

资料上说执行 crontab -e ,编辑完会自动保存到/var/spool/cron/username.
可是linux的编辑模式太痛苦了,后面还是叫sa处理一下,
结果,他直接在etc/crontab上加,有点奈闷,这又是啥原理嘛
 算了, 这不是很重点, 还是具体了解下它的文件格式:
句式: 
1 0 * * * elian /home/elian/build/build.sh 1>/dev/null 2>&1
说明:
  1. 前五位分别是: 分/时/日/月/周
  2. 第六位是执行的用户
  3. 第七位是执行的命令
后记:
 呵呵,在etc/crontab添加,没有自动跑起来,最后还是用起了 crontab -e 的方式

Monday, January 5, 2009

sh,不得不说

   sh,即shell啦..鉴于对win的熟悉,在它的环境下从不用刻意的说要学下bat,想要什么就拿什么的感觉. 但在linux下用sh,还是挺陌生的,决定将用过的信息记载下

username=$(svnlook author "$REPOS" -t "$TXN")
## 将执行svnlook命令获得的值赋给username变量

if [ "$username" = "yusulian" ];
then
 exit 0;
fi
## 比较username账号的值是不是等于yusulian,如果是就退出去(exit 0)
## 这里要注意的是比较的格式一定不要漏掉中括号[条件]

linux下玩lftp

基本常识
whereis lftp ## 查看lftp的路径
/usr/bin/lftp ## 执行lftp命令
lftp :~> open ftp地址 ## 在ftp环境下连接远程服务器
lftp :~> help ## 查看在ftp环境下的命令
lftp 192.168.1.1:~> user 账号名称 ## 登录账号,回车,你也可以空格明文写上密码
Password: 账号密码 ## 输入登录账号密码
lftp 192.168.1.1:~> ls ## 登录成功后输入显示所有目录

详说mirror 
说明: 上传/下载文件夹,包含子文件夹
格式: mirror [OPTS] [remote [local]]
上传: 
mirror -R /data0/Linux/src/Product/Release/ /Public/YuSuLian_SCM/linux/
mirror -R /data0/Linux/src/Product/Release/ /Public/YuSuLian_SCM/linux
最后/有没有的区别,第一句会在ftp中创建一个Release目录,而第二句不会,直接将Product/Release/下的数据放到linux目录下
下载: mirror /DubaPublic/YuSuLian_SCM/linux/ /data0/DAE_ScanEngine_Linux/src/Product/Release/
要注意上传下载本地路径与远程路径是不一样的

例子:PutFileToFtp.sh
#!/bin/sh
#

workdir=/data0/build/build_src/Linux
filedir=/data0/build/build_files
numfile=$filedir/build.number
buildnum=$(cat "$numfile")
reslutdir=$(date +%Y%m%d).$buildnum
localdir=$workdir/src/Product/Release/
remotedir=/DubaPublic/SCM/linux/$reslutdir

echo open 192.168.1.5>"$filedir/ftpcfg.txt"
echo user ysl 123123>>"$filedir/ftpcfg.txt"
echo mirror -R "$localdir" "$remotedir" >>"$filedir/ftpcfg.txt"
echo quit>>"$filedir/ftpcfg.txt"

lftp -f "$filedir/ftpcfg.txt"

例子错误
[elian@localhost build]$ sudo sh PutFileToFtp.sh
错误信息: PutFileToFtp.sh: PutFileToFtp.sh: cannot execute binary file
处理方法: 存储格式的问题,PutFileToFtp.sh文件是我在win下创建的,转为utf-8格式要将"添加Unicode签名"选项去掉

Sunday, January 4, 2009

linux常用命令

linux下的命令,可以用man 命令查看帮助

拥用管理员操作权  sudo

查找安装软件
rpm -qa|grep sub
rpm -e  subversion-1.1.4-2

卸载rpm格式软件  rpm -ivh *.rpm

升级某rpm文件  rpm -Uvh *.rpm  

删除subversion-1.4.5目录  rm subversion-1.4.5 -rf

退出  logout

打开profile文件编辑  vi /etc/profile

改变kice目录的拥用者  chown -R www kice

改变kice目录的权限为777   chmod -R 777 kice

查看子目录的大小   for item in $(ls);do echo ${item};du -hs ${item};done

查看当前目录的大小  du -hs

查看svn进程  ps auxwww|grep svn

杀掉41424进程  sudo kill -9 41424. 

目录映射  ln -s /data1/ksmatrix/wps/wpspublic /data1/wpspublic

添加账号  adduser joe

设置密码  passwd joe (键入joe的口令) 

获取日期 date 

获取文本信息 cat

数值计算 expr

查看linux系统版本
1)uname -a 
2)cat /proc/version 
3)cat /etc/issue
4) ls /boot

移动目录 mv svnmanager-1.04 /usr/local/www/apache22/data/svnmanager

解压文件 tar -xvzf svnmanager-1.04.tar.gz