2011年10月28日金曜日

[LINUX 基础] 系统监控命令

1. 查看当前目录下各文件夹大小 (MByte) 并排序
$ du --max-depth=1 -m | sort -n
$ du --max-depth=1 -m | sort -n -r
$ ls -l | awk '{print $9}' | xargs du -s -m | sort -n
$
ls -l | awk '{print $9}' | xargs du -s -m | sort -n -r

2011年10月24日月曜日

[LINUX 基础] 用户与用户组

1 与用户 (user) 和用户组 (group) 相关的配置文件
1-1 与用 (user) 相关的配置文件
/etc/passwd 注 : 用户 (user) 的配置文件
/etc/shadow 注 : 用户 (user) 影子口令文件

1-2 与用户组 (group) 相关的配置文件
/etc/group   注 : 用户组 (group) 配置文件
/etc/gshadow 注 : 用户组 (group) 的影子文件


2 管理用户 (user) 和用户组 (group) 的相关工具或命令
2-1 管理用户 (user) 的工具或命令
useradd  注 : 添加用户
adduser  注 : 添加用户
userdel  注 : 删除用户
passwd   注 : 为用户设置密码
usermod  注 : 修改用户命令 (usermod -a -G root username)
pwcov    注 : 同步用户从/etc/passwd 到 /etc/shadow
pwck     注 : pwck 是校验用户配置文件 /etc/passwd 和 /etc/shadow 文件内容是否合法或完整
pwunconv 注 : 是 pwcov 的立逆向操作, 是从 /etc/shadow 和 /etc/passwd 创建 /etc/passwd, 然后会删除 /etc/shadow 文件
finger   注 : 查看用户信息工具
id       注 : 查看用户的 UID, GID 及所归属的用户组
chfn     注 : 更改用户信息工具
su       注 : 用户切换工具
sudo     注 : 通过另一个用户来执行命令, 比如不需要 root 密码就可以执行 root 赋与的执行只有 root 才能执行相应的命令 (visudo 来编辑 /etc/sudoers 来实现)
visudo   注 : visodo 是编辑 /etc/sudoers 的命令. 也可以不用这个命令, 直接用 vi 来编辑 /etc/sudoers 的效果是一样的
sudoedit 注 : 和 sudo 功能差不多

2-2 管理用户组 (group) 的工具或命令
groupadd  注 : 添加用户组
groupdel  注 : 删除用户组
groupmod  注 : 修改用户组信息
groups    注 : 显示用户所属的用户组
grpck     注 : 校验用户配置文件 /etc/group 和 /etc/gshadow 文件内容是否合法或完整
grpconv   注 : 通过 /etc/group 和 /etc/gshadow 的文件内容来同步或创建 /etc/gshadow, 如果 /etc/gshadow 不存在则创建
grpunconv 注 : 通过 /etc/group 和 /etc/gshadow 文件内容来同步或创建 /etc/group, 然后删除 /etc/gshadow 文件


3 /etc/skel 目录 (均为隐藏文件)
3-1 存放用户启动文件的目录, 由 root 权限控制
3-2 添加用户时, 目录下的文件自动复制到新添加的用户的家目录
3-3 通过修改添加删除 /etc/skel 目录下的文件, 来为用户提供一个统一标准的默认用户环境
3-4 我们通过修改 /etc/passwd 来添加用户, 可以自己创建用户的家目录, 把 /etc/skel 下的文件复制到用户的家目录, 然后 chown 改变新用户家目录的属主


4 /etc/login.defs 配置文件
4-1 这个文件是当创建用户时的一些规划, 比如创建用户时, 是否需要家目录, UID和GID的范围, 用户的期限等等
4-2 这个文件是可以通过 root 来定义


5 /etc/default/useradd 文件 (通过 useradd 添加用户时的规则文件)

2011年10月5日水曜日

[PL/SQL相关] 游标使用示例

------------------------------------------------------------
-- 显式游标
-- 每次提取一条数据 (带参数的游标)
declare
    cursor emp_cursor(no emp.deptno%type) is
        select ename,sal from emp where deptno=no;
    v_ename emp.ename%type;
    v_sal emp.sal%type;
begin
    open emp_cursor(10);
    loop
        fetch emp_cursor into v_ename,v_sal;
        exit when emp_cursor%notfound;
        dbms_output.put_line(v_ename||': '||v_sal);
    end loop;
    close emp_cursor;
end;
/

-- 一次提取所有数据
declare
    cursor emp_cursor is
        select ename from emp where deptno=10;
    type ename_table_type is table of emp.ename%type;
    ename_table ename_table_type;
begin
    open emp_cursor;
    fetch emp_cursor bulk collect into ename_table;
    for i in 1..ename_table.count loop
        dbms_output.put_line(ename_table(i));
    end loop;
    close emp_cursor;
end;
/

-- 一次提取部分数据
declare
    type name_array_type is varray(5) of emp.ename%type;
    name_array name_array_type;
    cursor emp_cursor is select ename from emp;
    rows int:=5;
    v_count int:=0;
begin
    open emp_cursor;
    loop
        fetch emp_cursor bulk collect into name_array limit rows;
        dbms_output.put('name: ');
        for i in 1..(emp_cursor%rowcount-v_count) loop
            dbms_output.put(name_array(i)||' ');
        end loop;
        dbms_output.new_line;
        v_count:=emp_cursor%rowcount;
        exit when emp_cursor%notfound;
    end loop;
    close emp_cursor;
end;
/

-- 基于游标定义记录变量
declare
    cursor emp_cursor is select ename,sal from emp;
    emp_record emp_cursor%rowtype;
begin
    open emp_cursor;
    loop
        fetch emp_cursor into emp_record;
        exit when emp_cursor%notfound;
        dbms_output.put_line('name: '||emp_record.ename
            ||' sal: '||emp_record.sal);
    end loop;
    close emp_cursor;
end;
/

-- 使用游标更新数据
declare
    cursor emp_cursor is
        select ename,sal from emp for update of emp.deptno nowait;
    v_ename emp.ename%type;
    v_oldsal emp.sal%type;
begin
    open emp_cursor;
    loop
        fetch emp_cursor into v_ename,v_oldsal;
        exit when emp_cursor%notfound;
        if v_oldsal<2000 then
            update emp set sal=sal+100 where current of emp_cursor;
        end if;
    end loop;
    close emp_cursor;
    commit;
end;
/

------------------------------------------------------------
-- 隐式游标
-- 游标for循环
declare
    cursor emp_cursor is select ename,sal from emp;
begin
    for emp_record in emp_cursor loop
        dbms_output.put_line(emp_cursor%rowcount
            ||': '||emp_record.ename);
    end loop;
end;
/

-- 可以直接使用子查询代替显式游标
begin
    for emp_record in (select ename,sal from emp) loop
        dbms_output.put_line(emp_record.ename);
    end loop;
end;
/

-- 游标变量
-- 定义ref cursor类型时不指定return子句
declare
    type emp_cursor_type is ref cursor;
    emp_cursor emp_cursor_type;
    emp_record emp%rowtype;
begin
    open emp_cursor for select * from emp where deptno=10;
    loop
        fetch emp_cursor into emp_record;
        exit when emp_cursor%notfound;
        dbms_output.put_line(emp_cursor%rowcount||': '
            ||emp_record.ename);
    end loop;
    close emp_cursor;
end;
/

-- 定义ref cursor类型时指定return子句
declare
    type emp_record_type is record (
        name emp.ename%type,sal emp.sal%type);
    type emp_cursor_type is ref cursor
        return emp_record_type;
    emp_cursor emp_cursor_type;
    emp_record emp_record_type;
begin
    open emp_cursor for select ename,sal from emp;
    loop
        fetch emp_cursor into emp_record;
        exit when emp_cursor%notfound;
        dbms_output.put_line(emp_cursor%rowcount||':'
            ||emp_record.name||' '||emp_record.sal);
    end loop;
    close emp_cursor;
end;
/

-- cursor表达式
declare
    type refcursor is ref cursor;
    cursor dept_cursor(no number) is
        select a.dname,cursor(select ename,sal from emp
            where deptno=a.deptno)
        from dept a where a.deptno=no;
    empcur refcursor;
    v_dname dept.dname%type;
    v_ename emp.ename%type;
    v_sal emp.sal%type;
begin
    open dept_cursor(&no);
    loop
        fetch dept_cursor into v_dname,empcur;
        exit when dept_cursor%notfound;
        dbms_output.put_line(v_dname);
        loop
            fetch empcur into v_ename,v_sal;
            exit when empcur%notfound;
            dbms_output.put(v_ename||': '||v_sal||' ';
        end loop;
        dbms_output.new_line;
    end loop;
    close dept_cursor;
end;
/
------------------------------------------------------------