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

2023-10-10 21:32

本文主要是介绍Linux 前后台作业切换及脱机管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    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 前后台作业切换及脱机管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183224

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet