开发者社区> leshami> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linux 前后台作业切换及脱机管理

简介:     Linux bash shell单一终端界面下,我们经常需要管理或同时完成多个作业,如一边执行编译,一边实现数据备份,以及执行SQL查询等其他的任务。
+关注继续查看

    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体系结构) 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
LINUX重启MYSQL的命令
如何启动/停止/重启MySQL 一、启动方式 1、使用 service 启动:service mysqld start 2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start 3、使用 safe_mysqld 启动:safe_mysqld& 二、停止 1、使...
2165 0
Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50
Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维   查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l $'^\xEF\xBB\xBF' ./ \xef\xbb\xbf是UTF8 BOM的16进制表示   这个命令会把当前目录及所有子目录下的BOM头删除掉。
1101 0
linux fdisk命令使用
fdisk 对硬盘及分区的操作,进入fdisk 对硬盘操作阶段  我们可以对硬盘进行分区操作,前提是您把fdisk -l 弄明白了;通过fdisk -l ,我们能找出机器中所有硬盘个数及设备名称;比如上面的例子,我们会看到两个设备一个是/dev/hda ,另一个是/dev/sda ;  fdisk ...
863 0
Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
磁盘分区表、文件系统的查看、统计的工具很多,有些工具是多功能的,不仅仅是查看磁盘的分区表,而且也能进行磁盘分区的操作;但在本文,我们只讲磁盘分区的查看,以及分区的使用情况的查看;本文只是给新手上路之用;关于分区工具的操作,我将在以后做专门介绍;此文目的:主要是向初学者介绍一下入门必备的一点基础知识,...
1059 0
Linux Screen命令使用
参考URL: http://jingyan.baidu.com/article/295430f128d8ea0c7e005089.html ~~~~~~~~~~~~~~~~~~~~~~~~ 其它的不提,主要用的几个命令: A,screen -S screenname B,在screen窗口...
639 0
18 个命令&工具帮你定位 Linux 性能问题
1.TopTop命令是一个性能监控程序,它按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了CPU的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程PID、所使用命令以及其他。
1251 0
[SHELL进阶] (转)最牛B的 Linux Shell 命令 (四)
1.查看ASCII码表 man 7 ascii  很多人初学编程都会接触到ascii码的概念,有时候为了查某个符号的ascii值,可能还得翻箱倒柜找出当年的课本?Linux Manpage里面其实包含了很多类似的实用资料,上述命令就能很详细的方式解释ascii编码,当然这里还有在线版。
1076 0
+关注
leshami
传播知识,分享快乐!十年以上数据库,系统运维与管理,性能优化经验。全部文章,欢迎扩散,转载请注明出处!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ECS系统指南之Linux系统诊断
立即下载
ECS运维指南 之 Linux系统诊断
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载