Linux bash shell单一终端界面下,我们经常需要管理或同时完成多个作业,如一边执行编译,一边实现数据备份,以及执行SQL查询等其他的任务。所有的上述的这些工作我们可以在一个bash内实现,也就是说在同一个终端窗口完成。下面主要描述了Linux下前后台作业切换与管理以及作业在脱机的情形下如何管理。
1、前后台作业的定义
前后台作业实际上对应的也就是前后台进程,因此也就有对应的pid。在这里我们统称为作业。
无论是前台作业还是后台作业,两者都来自当前的shell,是当前shell的子程序。
下面是两者的定义。
前台作业:可以由用户参与交互及控制的作业我们称之为前台作业。
后台作业:在内存可以自运行的作业,用户无法参与交互以及使用[ctrl]+c来终止,只能通过bg或fg来调用该作业。
2、几个常用的作业命令
a、command & 直接让作业进入后台运行
b、[ctrl]+z 将当前作业切换到后台
c、jobs 查看后台作业状态
d、fg %n 让后台运行的作业n切换到前台来
d、bg %n 让指定的作业n在后台运行
e、kill %n 移除指定的作业n
"n" 为jobs命令查看到的job编号,不是进程id。
每一个job会有一个对应的job编号,编号在当前的终端从1开始分配。
job 编号的使用样式为[n],后面可能会跟有 "+" 号或者 "-" 号,或者什么也不跟。
"+" 号表示最近的一个job,"-" 号表示倒数第二个被执行的Job。注,"+" 号与 "-" 号会随着作业的完成或添加而动态发生变化。
通过jobs方式来管理作业,当前终端的作业在其他终端不可见。
3、演示后台作业命令
a、直接将作业放入到后台(附加 & 符号) robin@SZDB:/tmp> tar -czvf temp.tar.gz tempSYBO2SZ.dbf & [1] 12500 robin@SZDB:/tmp> tempSYBO2SZ.dbf robin@SZDB:/tmp> #此时可进行其它操作,作业一旦完成,会弹出如下的提示 [1]+ Done tar -czvf temp.tar.gz tempSYBO2SZ.dbf robin@SZDB:/tmp> ls -hltr temp* -rwxr-xr-x 1 robin oinstall 490M 2013-05-02 17:48 tempSYBO2SZ.dbf -rw-r--r-- 1 robin oinstall 174M 2013-05-02 17:50 temp.tar.gz b、已经开始执行,但需要放入后台(使用[ctrl]+z) robin@SZDB:/tmp> tar -czvf temp2.tar.gz tempSYBO2SZ.dbf tempSYBO2SZ.dbf [1]+ Stopped tar -czvf temp2.tar.gz tempSYBO2SZ.dbf robin@SZDB:/tmp> jobs [1]+ Stopped tar -czvf temp2.tar.gz tempSYBO2SZ.dbf #下面同时发布两个作业,并且在中途按下[ctrl]+z以便将当前作业提交到后台 robin@SZDB:/tmp> find /u02 -type f -size +100000k robin@SZDB:/tmp> find / -type f -size +100000k #再次查看当前的jobs时,jobs管理器里出现了3个处于stopp状态的job robin@SZDB:/tmp> jobs [1] Stopped tar -czvf temp2.tar.gz tempSYBO2SZ.dbf [2]- Stopped find / -type f -size +100000k [3]+ Stopped find /u02 -type f -size +100000k robin@SZDB:/tmp> jobs -l #使用-l参数查看当前shell下所有的作业以及对应的job number,进程pid [1] 32682 Stopped tar -czvf temp2.tar.gz tempSYBO2SZ.dbf [2]- 32687 Stopped find /u02 -type f -size +100000k [3]+ 32707 Stopped find / -type f -size +100000k #下面通过pid可以查看到对应的进程信息 robin@SZDB:/tmp> ps -ef | grep 32707 | grep -v grep robin 32707 32095 0 09:48 pts/1 00:00:00 find / -type f -size +100000 robin@SZDB:/tmp> tty #当前终端的信息为pts/1 /dev/pts/1 #打开另外一个终端 robin@SZDB:~> tty /dev/pts/3 robin@SZDB:~> jobs #此时可以看到jobs命令无任何返回 robin@SZDB:~> ps -ef | grep 32707 | grep -v grep #仅仅根据进程id可以找到对应的作业 robin 32707 32095 0 09:48 pts/1 00:00:00 find / -type f -size +100000 #由上可知,对于当前shell下的jobs,仅当前shell(终端)可见 c、将后台作业切换到前台(fg命令) robin@SZDB:/tmp> fg #省略Job number的情形,则将缺省的job切换到前台 find / -type f -size +100000k /u02/database/old/CNMMBOBK/undo/undotbsCNMMBOBK.dbf ...... [ctrl]+z robin@SZDB:/tmp> fg %1 tar -czvf temp2.tar.gz tempSYBO2SZ.dbf robin@SZDB:/tmp> jobs [2]- Stopped find /u02 -type f -size +100000k [3]+ Stopped find / -type f -size +100000k d、运行后台中暂停的作业(bg命令) #前面有2个job处于stopped状态,现在我们让其在后台运行,直接输入bg命令则缺省的job继续运行,否则输入job编号,运行指定的job robin@SZDB:/tmp> bg 2 #输入bg 2之后,可以看到原来的命令后被追加了& [2]- find /u02 -type f -size +100000k & robin@SZDB:/tmp> jobs [2]- Running find /u02 -type f -size +100000k & [3]+ Stopped find / -type f -size +100000k e、移除指定的作业n(kill) robin@SZDB:/tmp> jobs [3]+ Stopped find / -type f -size +100000k robin@SZDB:/tmp> kill -9 %3 #强制终止job 3,注意,此处的%不可省略 robin@SZDB:/tmp> jobs [3]+ Killed find / -type f -size +100000k robin@SZDB:/tmp> jobs #kill -9 表明强制终止指定的Job,-15则表明是正常终止指定的job。 kill -l 则列出kill能够使用的所有信号 #对于上述命令的详细帮助,使用 man command来获取帮助信息 f、带参shell脚本的后台处理 #下面是一个测试用的shell脚本 robin@SZDB:~/dba_scripts/custom/bin> more echo_time.sh #!/bin/bash SID=$1 sqlplus -S scott/tiger@$1 <<EOF select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') today from dual; begin dbms_lock.sleep(300); end; / select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') today from dual; exit; EOF exit #直接执行带参的shell脚本 # Author : Robinson # Blog : http://blog.csdn.net/robinson_0612 robin@SZDB:~/dba_scripts/custom/bin> ./echo_time.sh CNMMBO TODAY ------------------- 2013-05-03 11:07:48 [1]+ Stopped ./echo_time.sh CNMMBO #按下[ctrl]+z将其切换到后台 robin@SZDB:~/dba_scripts/custom/bin> jobs [1]+ Stopped ./echo_time.sh CNMMBO robin@SZDB:~/dba_scripts/custom/bin> kill -9 %1 #强制终止该job [1]+ Stopped ./echo_time.sh CNMMBO robin@SZDB:~/dba_scripts/custom/bin> jobs #此时该job已经被标记为killed [1]+ Killed ./echo_time.sh CNMMBO robin@SZDB:~/dba_scripts/custom/bin> ./echo_time.sh CNMMBO & #将shell脚本参数之后跟 &符号即将job放入到后台 [1] 2233 robin@SZDB:~/dba_scripts/custom/bin> #此时依旧可以看到有输出,但可以继续后续操作 TODAY ------------------- 2013-05-03 11:08:25 robin@SZDB:~/dba_scripts/custom/bin> jobs [1]+ Running ./echo_time.sh CNMMBO & robin@SZDB:~/dba_scripts/custom/bin> ./echo_time.sh CNMMBO >temp.log 2>&1 & #最佳的办法是直接将其输出到日志文件 [2] 2256 robin@SZDB:~/dba_scripts/custom/bin> jobs [1]- Running ./echo_time.sh CNMMBO & [2]+ Running ./echo_time.sh CNMMBO >temp.log 2>&1 & #下面来查看日志,日志中的两次查询正好相差5分钟 robin@SZDB:~/dba_scripts/custom/bin> more temp.log TODAY ------------------- 2013-05-03 11:09:24 PL/SQL procedure successfully completed. TODAY ------------------- 2013-05-03 11:14:24
4、作业脱机管理
将作业(进程)切换到后台可以避免由于误操作如[ctrl]+c等导致的job被异常中断的情形,而脱机管理主要是针对终端异常断开的情形。 通常使用nohup命令来使得脱机或注销之后,Job依旧可以继续运行。也就是说nohup忽略所有挂断(SIGHUP)信号。 如果该方式命令之后未指定&符号,则job位于前台,指定&符号,则job位于后台。 #下面是使用nohup的示例,可以省略日志的输出,因为原job的输出会自动被nohup重定向到缺省的nohup.out日志文件 robin@SZDB:~/dba_scripts/custom/bin> nohup ./echo_time.sh CNMMBO nohup: appending output to `nohup.out' #直接断开终端,并重新连接一个新的终端窗口 robin@SZDB:~/dba_scripts/custom/bin> jobs #由于是一个新的终端,所以jobs无法看到任何作业 robin@SZDB:~/dba_scripts/custom/bin> ps -ef | grep echo_time.sh robin 2623 1 0 11:26 ? 00:00:00 /bin/bash ./echo_time.sh CNMMBO robin@SZDB:~/dba_scripts/custom/bin> more nohup.out #其输出的日志可以看到job被成功完成 TODAY ------------------- 2013-05-03 11:26:32 PL/SQL procedure successfully completed. TODAY ------------------- 2013-05-03 11:31:32 #下面使用nohup方式且将Job放入后台处理,同时指定了日志文件,则nohup使用指定的日志文件,而不会输出到缺省的nohup.out robin@SZDB:~/dba_scripts/custom/bin> nohup ./echo_time.sh CNMMBO >temp2.log 2>&1 & [1] 3019 robin@SZDB:~/dba_scripts/custom/bin> jobs [1]+ Running nohup ./echo_time.sh CNMMBO >temp2.log 2>&1 &
更多参考
有关Oracle RAC请参考
使用crs_setperm修改RAC资源的所有者及权限
使用crs_profile管理RAC资源配置文件
RAC 数据库的启动与关闭
再说 Oracle RAC services
Services in Oracle Database 10g
Migrate datbase from single instance to Oracle RAC
Oracle RAC 连接到指定实例
Oracle RAC 负载均衡测试(结合服务器端与客户端)
Oracle RAC 服务器端连接负载均衡(Load Balance)
Oracle RAC 客户端连接负载均衡(Load Balance)
ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
ORACLE RAC 监听配置 (listener.ora tnsnames.ora)
配置 RAC 负载均衡与故障转移
CRS-1006 , CRS-0215 故障一例
基于Linux (RHEL 5.5) 安装Oracle 10g RAC
使用 runcluvfy 校验Oracle RAC安装环境
有关Oracle 网络配置相关基础以及概念性的问题请参考:
配置非默认端口的动态服务注册
配置sqlnet.ora限制IP访问Oracle
Oracle 监听器日志配置与管理
设置 Oracle 监听器密码(LISTENER)
配置ORACLE 客户端连接到数据库
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 冷备份
Oracle 热备份
Oracle 备份恢复概念
Oracle 实例恢复
Oracle 基于用户管理恢复的处理
SYSTEM 表空间管理及备份恢复
SYSAUX表空间管理及恢复
Oracle 基于备份控制文件的恢复(unsing backup controlfile)
有关RMAN的备份恢复与管理请参考
RMAN 概述及其体系结构
RMAN 配置、监控与管理
RMAN 备份详解
RMAN 还原与恢复
RMAN catalog 的创建和使用
基于catalog 创建RMAN存储脚本
基于catalog 的RMAN 备份与恢复
RMAN 备份路径困惑
使用RMAN实现异机备份恢复(WIN平台)
使用RMAN迁移文件系统数据库到ASM
linux 下RMAN备份shell脚本
使用RMAN迁移数据库到异机
有关ORACLE体系结构请参考
Oracle 表空间与数据文件
Oracle 密码文件
Oracle 参数文件
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 控制文件(CONTROLFILE)
Oracle 归档日志
Oracle 回滚(ROLLBACK)和撤销(UNDO)
Oracle 数据库实例启动关闭过程
Oracle 10g SGA 的自动化管理
Oracle 实例和Oracle数据库(Oracle体系结构)