shell多线程相关

一. shell并发(多进程)

1. 不控制进程数量

打印当前进程号$$
在代码末尾加入&,这次的代码会并行执行,因此for循环中的内容是并行的。
好像不用考虑并发问题
由于commands2需要在commands1都执行完成之后再执行,因此使用wait等待

#!/bin/bash  
for(( i = 0; i < ${count}; i++ ))  
do  
{  
        commands1  
}&  
done  
wait  
commands2  

2. 控制进程数量

#!bin/bash  
PRONUM=10               #进程个数  
tmpfile="$$.fifo"        #临时生成管道文件  
mkfifo $tmpfile  
exec 6<>$tmpfile  
rm $tmpfile  
  
for(( i=0; i<$PRONUM; i++ ))  
do  
        echo "init."  
done >&6  
for(( i = 0; i < ${count}; i++ ))  
do  
        read line  
        #echo $line  
        {  
                commands  
                echo "line${i} finished."  
        } >&6 &  
done <&6  
wait 

初始时给管道内写入PRONUM个字符串,然后每从管道内读出一个字符串就生成一个子进程,当管道内没有字符串可读时就阻塞在那里,不能创建新的子进程,一直等到有新的字符串进来时才继续运行。当每个并发进程执行完毕时又向管道内写入一个字符串,表示当前子进程已执行完毕,可以创建新的子进程了。

二. exec

source是在当前文件中执行shell命令
exec是用新的进程替换原来的进程,但是pid不变;由于fork之后,父子进程共享代码段,数据空间分开,采用写时copy的方式。所以fork之后立即用exec替换,很好的提高效率。运行之后也不再回到原来的程序中去。
system执行完还要回到原来的进程中去,system=fork+exec+waitpid;

命令 作用
exec ls 在shell中执行ls,ls结束后不返回原来的shell中了
exec < file 将file中的内容作为exec的标准输入
exec > file 将file中的内容作为标准写出
exec 3 < file 将file读入到fd3中
sort < &3 fd3中读入的内容被分类
exec 4 > file 将写入fd4中的内容写入file中
ls > &4 Ls将不会有显示,直接写入fd4中了,即上面的file中
exec 5 < &4 创建fd4的拷贝fd5
exec 3 <&- 关闭fd3

执行exec 4 > file会在/dev/fd中生成4号设备文件

三. &&、()、||决定linux命令的执行顺序

&&
顺序执行,如果前面退出,后面的不执行

cp sql.txt sql.bak.txt && cat sql.bak.txt 

||
执行左边的内容,如果不成功才执行右边的内容

#当打印1111.txt的第一列内容得命令被成功执行,则不执行打印facebook.txt的命令
awk '{print $1}' facebook.txt || cat facebook.txt

()
执行多个命令,与$$ ||等组合使用

#使用多个命令,如果sort命令执行成功,先将排序后的文件备份到/root/backup/目录下,然后再打印
sort facebook.txt > facebook.txt.sorted && (cp facebook.txt.sorted /root/backup/facebook.txt.sorted;ls facebook.txt.sorted)

四. FIFO

有名管道FIFO,能在任意进程间通信
无名管道pipe,只能在父子进程间通信
查看设备文件/dev/fd,使用步骤:

#创建设备文件
mkfifo $$.fifo
exec 6<>$$.fifo
#文件没有用,可以删除
#向6中写入
echo 1...`date` >&6
#从6中读取
read text <&6
echo $text

http://blog.csdn.net/wqq_721/article/details/7968099

其他

screen
nohup
exec

posted @ 2016-08-10 21:44  zhangshihai1232  阅读(401)  评论(0)    收藏  举报