⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multiple-processes.sh

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 SH
字号:
#!/bin/bash# parent.sh# 在多处理器(SMP box)的机器里运行多进程. # 作者: Tedman Eng#  我们下面要介绍两个脚本, 这是第一个, #+ 这两个脚本都要放到当前工作目录下. LIMIT=$1         # 想要启动的进程总数NUMPROC=4        # 并发的线程数量(forks?)PROCID=1         # 启动的进程IDecho "My PID is $$"function start_thread() {        if [ $PROCID -le $LIMIT ] ; then                ./child.sh $PROCID&                let "PROCID++"        else           echo "Limit reached."           wait           exit        fi}while [ "$NUMPROC" -gt 0 ]; do        start_thread;        let "NUMPROC--"donewhile truedotrap "start_thread" SIGRTMINdoneexit 0# ======== 下面是第二个脚本 ========#!/bin/bash# child.sh# 在SMP box上运行多进程. # 这个脚本会被parent.sh调用. # 作者: Tedman Engtemp=$RANDOMindex=$1shiftlet "temp %= 5"let "temp += 4"echo "Starting $index  Time:$temp" "$@"sleep ${temp}echo "Ending $index"kill -s SIGRTMIN $PPIDexit 0# ======================= 脚本作者注 ======================= ##  这个脚本并不是一点bug都没有. #  我使用limit = 500来运行这个脚本, 但是在过了开头的一两百个循环后, #+ 有些并发线程消失了! #  还不能确定这是否是由捕捉信号的冲突引起的, 或者是其他什么原因. #  一旦接收到捕捉的信号, 那么在下一次捕捉到来之前, #+ 会有一段短暂的时间来执行信号处理程序, #+ 在信号处理程序处理的过程中, 很有可能会丢失一个想要捕捉的信号, 因此失去一个产生子进程的机会. #  毫无疑问的, 肯定有人能够找出产生这个bug的原因, #+ 并且在将来的某个时候. . . 修正它.# ===================================================================== ## ----------------------------------------------------------------------################################################################### 下面的脚本是由Vernia Damiano原创. # 不幸的是, 它并不能正常工作. ##################################################################!/bin/bash#  要想调用这个脚本, 至少需要一个整形参数#+ (并发的进程数). #  所有的其他参数都传递给要启动的进程. INDICE=8        # 想要启动的进程数目TEMPO=5         # 每个进程最大的睡眠时间E_BADARGS=65    # 如果没有参数传到脚本中, 那么就返回这个错误码. if [ $# -eq 0 ] # 检查一下, 至少要传递一个参数给脚本. then  echo "Usage: `basename $0` number_of_processes [passed params]"  exit $E_BADARGSfiNUMPROC=$1              # 并发进程数shiftPARAMETRI=( "$@" )      # 每个进程的参数function avvia() {         local temp         local index         temp=$RANDOM         index=$1         shift         let "temp %= $TEMPO"         let "temp += 1"         echo "Starting $index Time:$temp" "$@"         sleep ${temp}         echo "Ending $index"         kill -s SIGRTMIN $$}function parti() {         if [ $INDICE -gt 0 ] ; then              avvia $INDICE "${PARAMETRI[@]}" &                let "INDICE--"         else                trap : SIGRTMIN         fi}trap parti SIGRTMINwhile [ "$NUMPROC" -gt 0 ]; do         parti;         let "NUMPROC--"donewaittrap - SIGRTMINexit $?: <<SCRIPT_AUTHOR_COMMENTS我需要使用指定的选项来运行一个程序, 并且能够接受不同的文件, 而且要运行在一个多处理器(SMP)的机器上. 所以我想(我也会)运行指定数目个进程, 并且每个进程终止之后, 都要启动一个新进程. "wait"命令并没有提供什么帮助, 因为它需要等待一个指定的后台进程, 或者等待*全部*的后台进程. 所以我编写了[这个]bash脚本程序来完成这个工作, 并且使用了"trap"指令.   --Vernia DamianoSCRIPT_AUTHOR_COMMENTS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -