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
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号