Linux Shell 多线程编程--原创

相关命令文件

1、runCommandInThreads.sh 多线程实现主代码

cdir=$(dirname $BASH_SOURCE) ##Current directory of this script file.
source $cdir/logUtil.sh

function createFile() {
	local dir=$1
	local idx=$2
	local fl="$dir/$idx"
	touch $fl
}

function execShellCommand() {
 
	local commd=$1
	local subPID="$!"
	$(debug "[$subPID] Execute command ‘$commd‘")
	eval "$commd"
}

### 设置并启动多线程 ###
## 参数:1、执行命令列表(对应一个数组)2、并发执行线程数
## 命令格式: source runCommandInThreads.sh && setupThreadsImmediately [执行命令列表] [并发执行线程数]
function setupThreadsImmediately() { 

 

	local startTimeSecs=$(date +"%s") 
	local parrelThreadsSize=${2:-2}
	local tmp=$1[@] 
	local commands=(${!tmp})
	local commandsSize=${#commands[*]} 

	local parrelThreadPidFileStoreDir="/tmp/parrel/"`date +%Y%m%d%H%M%S%s`
	if [ $commandsSize -le 0 ]; then
	 echo "No commands input."
	 return
	fi

	if [ ! -d $parrelThreadPidFileStoreDir ]; then
		trace "Create direcotry:"$parrelThreadPidFileStoreDir
		mkdir -p $parrelThreadPidFileStoreDir
	fi

	$(info "parrelThreadsSize:${parrelThreadsSize} ,commandsSize:$commandsSize")
	##
	# for ((i=0;i<$parrelThreadsSize;i++));do 
		# $(createFile $parrelThreadPidFileStoreDir "$i")
	# done

	##
	local mainPID="main"
	local threadCount=0

	for ((i=0; i<commandsSize; i++));do 
		while [ -z "" ]
		do
		  local chkFl="$(checkEnableEnroll $parrelThreadPidFileStoreDir $parrelThreadsSize $mainPID)"
		  if [ ! -z $chkFl ]; then #Start new thread.
			  threadCount=$(($threadCount+1))
			  touch $chkFl
			  $(trace "[$mainPID] Start new sub-thread")
			  {
			    ##let threadCount=$threadCount+1
				local tidx=$(($i+1))
			    local subPID="$tidx-$!"
				local subStartTm=$(date +"%s")
				##[ ! -f $chkFl ] && $(debug "[$subPID] file:$chkFl")

				echo "$subPID" > $chkFl
				##Do process in thread.
				##local cmd=()
				##eval cmd=\${$commands[@]}
				##cmd="$cmd"
 
				cmd="${commands[i]}"
				cmd=${cmd//,/ } 
				cmd=$cmd" "$subPID
				##$(execShellCommand "$cmd")
				$(debug "[$subPID] Execute command ‘$cmd‘")
				eval "$cmd"

				#------------Test-------------
				# $(debug "[$subPID] Execute command ‘$cmd‘")
				# local ev=`expr $tidx % 2`
				# if [ $ev -eq 0 ]; then
				   # sleep 4
				# else 
					# sleep 2
				# fi   

				[ -f $chkFl ] && rm $chkFl && $(trace "[$subPID] Deleted file $chkFl") 
				local subEndTm=$(date +"%s")
				$(info "$threadCount/$commandsSize [$subPID] Sub-thread has complete, elapse: "$(calcElapse $subStartTm $subEndTm))
			  } & ## Work in background.
			  break;
		  fi 
		  #chkFl="$(checkEnableEnroll $parrelThreadPidFileStoreDir $parrelThreadsSize $mainPID)"
		done
	done  

	##debug "Delete direcotry:"$parrelThreadPidFileStoreDir
	wait # Wait for all sub threads.  
	local endTimeSecs=$(date +"%s") 
	##local elapseTime=$(($startTimeSecs-$endTimeSecs))
	info "--- Finish all, elapse: "$(calcElapse $startTimeSecs $endTimeSecs)"-----" 
	rm -rf $parrelThreadPidFileStoreDir	  
		 
}

function calcElapse() {

	local st=$1
	local et=$2
	local elapseTime=$(($et-$st))
	echo $((elapseTime/60))" mins "$((elapseTime%60))" seconds"
}

function checkEnableEnroll() {
	local dir=$1
	local len=$2 
	local pid=$3
	local fl=""
	local i=0;
	for ((i=0;i<$len;i++));do 
		fl="$dir/$i"
		if [ ! -f $fl ]; then 
		 trace "[$pid] found "$fl
		 echo $fl
		 return
		else 
		  trace "Ignore $fl"
		fi 
	done
	echo ""
}

2、 logUtil.sh  打印日志

 
# if [ ! -z $INCLUDING_LOG_UTIL ]; then  
   # return 
# fi

export INCLUDING_LOG_UTIL="true"    
export LOG_DEFAULT_LVL=-1
export LOG_TRACE_LVL=10
export LOG_DEBUG_LVL=20
export LOG_INFO_LVL=30
export LOG_WARN_LVL=40
export LOG_ERROR_LVL=50

function trace() { 
	local logLvl=${LOGLVL:-$LOG_DEFAULT_LVL}   
	if [ $logLvl -le $LOG_TRACE_LVL ]; then
		local tm="`date +%T`"
		echo "TRACE $tm $*">&2
	fi 
}

function debug() { 
	local logLvl=${LOGLVL:-$LOG_DEFAULT_LVL}   
	if [ $logLvl -le $LOG_DEBUG_LVL ]; then
		local tm="`date +%T`"
		echo "DEBUG $tm $*">&2
	fi 
}

function info() { 
	local logLvl=${LOGLVL:-$LOG_DEFAULT_LVL} 
	if [ $logLvl -le $LOG_INFO_LVL ]; then
		local tm="`date +%T`"
		echo "INFO $tm $*">&2
	fi 
}  

function warn() { 
	local logLvl=${LOGLVL:-$LOG_DEFAULT_LVL} 
	if [ $logLvl -le $LOG_WARN_LVL ]; then
		local tm="`date +%T`"
		echo "WARN $tm $*">&2
	fi 
}  

function error() { 
	local logLvl=${LOGLVL:-$LOG_DEFAULT_LVL} 
	if [ $logLvl -le $LOG_ERROR_LVL ]; then
		local tm="`date +%T`"
		echo "ERROR $tm $*">&2
	fi 
}
时间: 2024-10-06 00:43:27

Linux Shell 多线程编程--原创的相关文章

Linux Shell 多线程编程

#!/bin/bash #---------------------------–  # 此例子说明了一种用wait.read命令模拟多线程的一种技巧  # 此技巧往往用于多主机检查,比如ssh登录.ping等等这种单进程比较慢而不耗费cpu的情况  # 还说明了多线程的控制  #---------------------------– function a_sub { # 此处定义一个函数,作为一个线程(子进程)    sleep 3 # 线程的作用是sleep 3s  } tmp_fifof

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux pthread多线程编程模板

pthread_create() 创建线程,pthread_join()让线程一直运行下去. 链接时要加上-lpthread选项. pthread_create中, 第三个参数为线程函数,定义如下: void * heartbeat_thread() { ... } 下面是main.c : #include <pthread.h> pthread_t thread[MAX_THREAD_NUM]; pthread_mutex_t cache_mutex; pthread_mutex_t var

Linux 的多线程编程的高效开发经验(转)

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱.我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程

转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一

[转]Linux 的多线程编程的高效开发经验

Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱.我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程编程. 我们假设读者都已经很熟悉 Linux 平台上基本的线程编程的 Pthread 库 API .其他的第三方用以线程编程

linux下多线程编程

最近研究mysql源码,各种锁,各种互斥,好在我去年认真学了<unix环境高级编程>, 虽然已经忘得差不多了,但是学过始终是学过,拿起来也快.写这篇文章的目的就是总结linux 下多线程编程,作为日后的参考资料. 本文将介绍linux系统下多线程编程中,线程同步的各种方法.包括: 互斥量(mutex) 读写锁 条件变量 信号量 文件互斥 在介绍不同的线程同步的方法之前,先简单的介绍一下进程和线程的概念, 它们的优缺点,线程相关的API,读者——写者问题和哲学家就餐问题. 基础知识 1. 进程和

Linux 的多线程编程的高效开发经验

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱.我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程

Linux Shell脚本编程while语句

Linux Shell脚本编程while语句案例 1,每隔3秒,打印一次系统负载 #!/bin/bash while truedo    uptime    sleep 3done 2,把监控结果保存到文件,在后台执行,然后用tail -f监控文件变化[email protected]:~/linux/shell/flow_control$ sh while.sh &[1] 12867 #!/bin/bash while truedo    uptime >> log.txt    s