Linux学习--No.4父子shell与后台模式
2020-02-15 本文已影响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的任务从后台执行转换到前台执行