美文网首页linux学习Linux入门
Linux学习--No.4父子shell与后台模式

Linux学习--No.4父子shell与后台模式

作者: 小贝学生信 | 来源:发表于2020-02-15 13:41 被阅读0次

理解Linux父子shell间的关系以及后台运行模式可以让我们更高效地完成一些任务。

要点1:父子shell

  • 父shell是指登录到虚拟终端所启动的的默认的交互shell,即刚进入时的状态;
  • 子shell:在父shell的CLI提示符后输入bin/bash命令或者其它等效的bash命令时,会创建一个新的shell程序。
bash
ps -f
#父子进程的关系可通过PID与PPID的关系看出。

值得注意的是进程的概念就是正在运行的程序。bash shell本身就是一个程序,它运行时就成为了一个进程。

bash
bash   #可以在子shell中再创造一个子shell,只是逻辑上可以,没有必要。
ps --forest   #可以形象的显示进程的层级关系
exit    #退出子shell
ps --forest

要点2:命令列表与进程列表

  • 命令列表:在多命令之间加上分号(;),可以一次性依次执行多命令。
pwd;ls;cd;pwd;ls
#观察返回内容
  • 进程列表:在给命令列表加一对括号。通过生成一个子shell,来执行命令列表的一系列命令。可以通过"echo $BASH_SUBSHELL"命令查看是否有子shell,有几个,如:
(pwd;ls;cd;pwd;ls)
(pwd;ls;cd;pwd;ls;echo $BASH_SUBSHELL)
(pwd;ls;cd;pwd;ls;(echo $BASH_SUBSHELL))
#在shell脚本中,经常使用子shell进行多进程处理,但另一方面也会拖慢处理速度。

要点3:后台模式执行命令

  • 命令末尾加上字符&,将命令置入后台模式;
  • 后台模式的好处是可以让出CLI,同时再输入另一个命令。处理更加高效。
sleep 30  #sleep命令用于引入一段时间的暂停。
sleep 30&   #回车键返回的是信息分别是后台作业号[]、后台作业的进程ID
ps -f
jobs  -l #专门显示当前运行在后台模式中的所有用户的进程;
#依次为作业号、PID、当前状态、对应的命令。

值得注意的是 &是指在后台运行,当用户退出(关闭)终端时,命令也会自动退出。nohup 是不挂断的运行,使命令可以永久的执行,直至完成,和用户终端没有关系,即使退出也不会影响。注意的是nohup本身没有后台运行的功能。因此后台模式& 搭配nohup可以高效完成任务

nohup prefetch  SRR1039511 -O ~ &    #后台不挂断的下载SRR1039511文件。
ps -ef|grep li
ps -ef|grep li|grep prefetch
cat nohup.out  #默认nohup.out为保存命令日志的文本信息
  • 除了查看nohup.out,也可以另外指定输出日志信息。一般1代表的是正确输出,2代表的是错误输出。下述命令会生成一个文本,1和2的输出流都输出到了SRR1039510.download.log里面。
nohup prefetch  SRR1039510 -O ~ 1>SRR1039510.download.log 2>&1 &  
  • 文章最后有一个利用nohup搭配&下载大批量生信数据的示例.

要点4:后台模式生成子shell工作

  • 将进程列表置入后台模式,即可以在子shell中进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。

(1)方法1:搭配&

(pwd;ls;cd;pwd;ls;echo $BASH_SUBSHELL)& 

(2)方法2:协程 coproc

coproc sleep 10   #同样返回作业号与进程ID,然后让出CLI
jobs  

注意此时jobs返回的第三列显示形式为"coproc 名字 命令 &"。coproc,命令&的显示都是固定的,名字一般默认为COPROC,也可以自己设置(用花括号)

coproc mytest { sleep 10; } 
#将任务名为mytest,同时花括号格式要注意空格不能省,且要加一个分号
jods

小彩蛋

记录一个用nohup搭配& 下载生信大文件的任务文件,参考自文章

echo SRR10395{10..14}
echo SRR10395{10..14} | sed 's/ /\n/g' >SRR_Acc_List.txt 
#把空格符转换为换行符,并存储为SRR_Acc_List.txt文件
cat SRR_Acc_List.txt |while read id;do echo "prefetch  $id -O ~ 1>$id.download.log 2>&1";done 
# 先用echo打印,检查一下命令有没有问题

1、直接执行任务

cat SRR_Acc_List.txt |while read id;do prefetch  $id -O ~ 1>$id.download.log 2>&1;done

2、后台不挂断执行

cat >prefetch.sh  #输入下一行代码,然后 ctrl+c
cat SRR_Acc_List.txt |while read id;do prefetch $id -O ~ 1>$id.download.log 2>&1 &;done
nohup bash prefetch.sh &   #后台不挂断执行脚本文件

小技巧

1、忘记把任务放入后台直接执行了?

  • 先ctrl+z 暂停进程;
  • 然后输入bg 放后台

2、终止后台进程

fg 1    #将任务号为1的任务从后台执行转换到前台执行

相关文章

网友评论

    本文标题:Linux学习--No.4父子shell与后台模式

    本文链接:https://www.haomeiwen.com/subject/kdmefhtx.html