`
sheep3600
  • 浏览: 9338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

【莫名其妙的退出】继续未完成的shell循环调用shell(一)

阅读更多
继续未完成的shell,用处是同步文件。
一层主机读取服务器列表,然后分发到二层相应服务器;
在由第二层读取服务器列表分发到第三层。

具体脚本如下:

#! /bin/sh
USER="root"
MODEL="root"

SRC="192.168.1.53"
SRCDIR=/home/root_rsync/
DSTDIR=""

DSTSH=$SRCDIR"s1.sh"
SERVER_LIST=$SRCDIR"server_list.txt"
BACKDIR=backfiles/
SECRET=$SRCDIR"se.pwd"
FLAG=""

# mysql information
HOST=-h192.168.1.53
USERNAME=-uroot
PASSWORD=-p123456


##
# Whether the parameters is exist
# 
# $1 argc
#
function check_argc {
  argcc=$1
  if [ $argcc ]
  then
    echo "The file name is:$argcc"
  else
    echo "argc one is null"
    exit 1
  fi
}

##
# Read list of the terminal servers
#
# $1 The dir of MP4 and the filename, But no suffix
#
function read_line {

  file_name=$1
  check_argc $file_name

  srcdir=$SRCSIR$file_name

# compute the directory structure with file name

  declare -i num4=0
  declare -i num3=0
  declare -i num2=0
  declare -i num1=0
  declare -i numInfo=$1

  num4=numInfo/16777216%256
  num3=numInfo/65536%256
  num2=numInfo/256%256

filePath=$num4"/"$num3"/"$num2"/"$file_name".mp4"

echo "11111111111111111111111111111111111111111111"
echo "22222222222222222222222222222222222222222222"
  while read line
  do
    dst=$line

# write rsync_log to mysql begin
    insert_sql $dst $filePath
# write rsync_log to mysql end

    check_network $dst
  if [ $? -ne 0 ]
  then
    echo .
    echo "!!!!!! ping $DST Host Connection Failed!"
    echo .
    update_sql 9 $dst $filePath
    echo ......
    echo ......
    echo ......
  else
    run_rsync $num4"/"$num3"/"$num2"/" $file_name $dst

# if run_rsync begin
    if [ $? -ne 0 ]
    then
      echo .
      echo "!!!!!! Send files failure!"
      echo .
      update_sql -1 $dst $filePath
      echo ......
      echo ......
      echo ......
    else
      update_sql 1 $dst $filePath
      send_terminal $dst $num4"/"$num3"/"$num2"/" $file_name

      if [ $? -ne 0 ]
      then
        echo .
        echo "!!!!!! Send files to other terminal failed!"
        echo .
      fi
      echo ......
      echo ......
      echo ......
    fi
# if run_rsync end
  fi

  done < $SERVER_LIST
}

##
# Check the network
#
# $1 dstIp
# 
function check_network {
echo "######## Check the network situation***"
  DST=$1
  ping $DST -c 2

#  if [ $? -ne 0 ]
#  then
#    echo .
#    echo "!!!!!! ping $DST Host Connection Failed!"
#    echo .
#    exit 1
#  fi
}

##
# Run the rsync, Send the MP4 to the terminal
#
# $1 directory
# $2 filename without suffix
# $3 dstIp
#
function run_rsync {

  srcdir=$1
  filename=$2
  dstip=$3

  echo "######## Start to send the files, the time is:"
  echo "######## "`date -d today +"%Y-%m-%d %T"`

mkdir -p $BACKDIR$srcdir
cp $filename".mp4" $BACKDIR$srcdir
rsync -avzR --password-file=$SECRET $BACKDIR$srcdir$filename".mp4" $USER@$dstip::$MODEL"/"

#currentDate=`date -d today +"%Y-%m-%d %T"`
#filePath=$srcdir$filename".mp4"
#  if [ $? -ne 0 ]
#  then
#    echo .

#echo "###### update send info fails begin"
#echo "UPDATE rsync_transport_log SET STATE_END_DATE='$currentDate', STATE='-1' WHERE FILE_PATH='$filePath'"
#mysql -uroot -p123456 << EOF
#use cdn
#UPDATE rsync_transport_log SET STATE_END_DATE='$currentDate', STATE='-1' WHERE FILE_PATH='$filePath';
#exit
#EOF
#echo "###### update send info fails end"
#    echo "!!!!!! Send files failure!"
#    echo .
#    exit 1
#  else
#echo "###### update send info success begin"
#echo "UPDATE rsync_transport_log SET STATE_END_DATE='$currentDate', STATE='1' WHERE FILE_PATH='$filePath'"
#mysql -uroot -p123456 << EOF
#use cdn
#UPDATE rsync_transport_log SET STATE_END_DATE='$currentDate', STATE='1' WHERE FILE_PATH='$filePath';
#exit
#EOF
#echo "###### update send info seccess end"


#  fi
  echo .
  echo "######## Send files finish:"
  echo "######## "`date -d today +"%Y-%m-%d %T"`
  echo .

}

##
# send the files to terminal
# 
# $1 Remote host IP
# $2 file position on remote
# $3 file name
#
function send_terminal {
  dst=$1
  dir=$2
  filename=$3

  echo "######## Begin to send the files to other terminal:"
  echo "######## "`date -d today +"%Y-%m-%d %T"`
  ssh $USER@$dst $DSTSH $dir$filename &
  echo "######## Send files to terminal finish:"
  echo "######## "`date -d today +"%Y-%m-%d %T"`
  echo .
}

##
# put the information into the mysql
# 
# $1 remote ip
# $2 filePath + fileName, eg:0/0/0/0.mp4
#
function insert_sql {
dst=$1
filePath=$2
currentDate=`date -d today +"%Y-%m-%d %T"`

echo "DELETE FROM rsync_transport_log WHERE FILE_PATH = '$filePath' AND SERVER_IP = '$dst'"
echo "INSERT INTO rsync_transport_log(SERVER_IP, PARENT_IP, FILE_PATH, STATE, STATE_START_DATE) VALUES('$dst', '$SRC', '$filePath', '0', '$currentDate')"

mysql -uroot -p123456 << EOF
use cdn
DELETE FROM rsync_transport_log WHERE FILE_PATH = '$filePath' AND SERVER_IP = '$dst';
INSERT INTO rsync_transport_log(SERVER_IP, PARENT_IP, FILE_PATH, STATE, STATE_START_DATE) VALUES('$dst', '$SRC', '$filePath', '0', NOW());
exit
EOF

}

##
# update the information
# 
# $1 STATE
# $2 remote ip
# $3 filePath + fileName, eg:0/0/0/0.mp4
# 
function update_sql {
state=$1
dst=$2
filePath=$3
currentDate=`date -d today +"%Y-%m-%d %T"`

echo "UPDATE rsync_transport_log SET STATE_END_DATE='$currentDate', STATE='$state' WHERE SERVER_IP='$dst' AND FILE_PATH='$filePath'"

mysql -uroot -p123456 << EOF
use cdn
UPDATE rsync_transport_log SET STATE_END_DATE=NOW(), STATE='$state' WHERE SERVER_IP='$dst' AND FILE_PATH='$filePath';
exit
EOF

}

read_line $1



服务器列表为txt文件,内容如下:
111.11.1.1
192.168.1.51
192.168.1.52
222.22.2.2





第二层服务器的脚本如下:


#! /bin/sh
USER="root"
MODEL="root"

SRC="192.168.1.52"
SRCDIR=/home/root_rsync/
DSTDIR=""

SERVER_LIST=$SRCDIR"server_list.txt"
BACKDIR=backfiles/
SECRET=$SRCDIR"se.pwd"

# mysql information
HOST=-h192.168.1.53
USERNAME=-uroot
PASSWORD=-p123456

##
# Whether the parameters is exist
# 
# $1 argc
#
function check_argc {
  argcc=$1
  if [ $argcc ]
  then
    echo "The file name is:$argcc"
  else
    echo "argc one is null"
    exit 1
  fi
}

##
# Read list of the terminal servers
#
# $1 The dir of MP4 and the filename, But no suffix
#
function read_line {
  
  check_argc $1
  filePath=$1".mp4"

  while read line
  do
    dst=$line



# write rsync_log to mysql begin
    insert_sql $dst $filePath
# write rsync_log to mysql end

    check_network $dst
  if [ $? -ne 0 ]
  then
    echo .
    echo "!!!!!! ping $DST Host Connection Failed!"
    echo .
    update_sql 9 $dst $filePath
    echo ......
    echo ......
    echo ......

  else
    run_rsync $1 $dst

# if run_rsync begin
    if [ $? -ne 0 ]
    then
      echo .
      echo "!!!!!! Send files failure!"
      echo .
      update_sql -1 $dst $filePath
      echo ......
      echo ......
      echo ......
    else
      update_sql 1 $dst $filePath
      echo ......
      echo ......
      echo ......
    fi
# if run_rsync end
  fi

  done < $SERVER_LIST
}


##
# Check the network
#
# $1 dstIp
# 
function check_network {
echo "######## Check the network situation***"
  dst=$1

  ping $dst -c 2
#  if [ $? -ne 0 ]
#  then
#    echo .
#    echo "!!!!!! ping $DST Host Connection Failed!"
#    echo .
#    exit 1
#  fi
}

##
# Run the rsync, Send the MP4 to the terminal
#
# $1 dir + filename but no suffix
# $2 dstIp
#
function run_rsync {

  srcdir=$1
  dstip=$2

  echo "######## Start to send the files, the time is: "
  echo "######## "`date -d today +"%Y-%m-%d %T"`
echo rsync -avzR --password-file=$SECRET $BACKDIR$srcdir".mp4" $USER@$dstip::$MODEL"/"
rsync -avzR --password-file=$SECRET $BACKDIR$srcdir".mp4" $USER@$dstip::$MODEL"/"

#  if [ $? -ne 0 ]
#  then
#    echo .
#    echo "!!!!!! Send files failure!"
#    echo .
#    exit 1
#  fi
  echo .
  echo "######## Send files finish: "
  echo "######## "`date -d today +"%Y-%m-%d %T"`
  echo .
}

##
# put the information into the mysql
# 
# $1 remote ip
# $2 filePath + fileName, eg:0/0/0/0.mp4
#
function insert_sql {
dst=$1
filePath=$2
currentDate=`date -d today +"%Y-%m-%d %T"`

echo "DELETE FROM rsync_transport_log WHERE FILE_PATH = '$filePath' AND SERVER_IP = '$dst'"
echo "INSERT INTO rsync_transport_log(SERVER_IP, PARENT_IP, FILE_PATH, STATE, STATE_START_DATE) VALUES('$dst', '$SRC', '$filePath', '0', '$currentDate')"

mysql $HOST $USERNAME $PASSWORD << EOF
use cdn
DELETE FROM rsync_transport_log WHERE FILE_PATH = '$filePath' AND SERVER_IP = '$dst';
INSERT INTO rsync_transport_log(SERVER_IP, PARENT_IP, FILE_PATH, STATE, STATE_START_DATE) VALUES('$dst', '$SRC', '$filePath', '0', NOW());
exit
EOF

}

##
# update the information
# 
# $1 STATE
# $2 remote ip
# $3 filePath + fileName, eg:0/0/0/0.mp4
# 
function update_sql {
state=$1
dst=$2
filePath=$3
currentDate=`date -d today +"%Y-%m-%d %T"`

echo "UPDATE rsync_transport_log SET STATE_END_DATE='$currentDate', STATE='$state' WHERE SERVER_IP='$dst' and FILE_PATH='$filePath'"

mysql $HOST $USERNAME $PASSWORD << EOF
use cdn
UPDATE rsync_transport_log SET STATE_END_DATE=NOW(), STATE='$state' WHERE SERVER_IP='$dst' and FILE_PATH='$filePath';
exit
EOF

}

read_line $1 >rsy.log 2>&1




第二层到第三层完全正常,第一层到第二层,只能循环前三个ip然后就over了

我将ip换了个位置,变成
192.168.1.51
192.168.1.52
XXX
XXX
这样的话,前两个可以循环到,然后shell就又退出了~~~。

这是为啥呢,初写shell,问题多多啊。
0
0
分享到:
评论
1 楼 sheep3600 2010-04-22  
终于找到了问题的所在,唉,大概说下我的理解吧。

read和sed共用一个标准输入的指针,read把第一行读完了,rsh或者sed把剩下的东西都读跑了,结果就闹得read读不到东西,循环退出了。

哇咔咔


加了个
sed 's/.*/ ( & )/'
才搞明白~~~~

相关推荐

    VBA示例之 求人不如自已动手 Shell调用的程序执行完成后再执行其它程序

    标题"VBA示例之 求人不如自已动手 Shell调用的程序执行完成后再执行其它程序"揭示了我们主要要学习的是通过VBA控制外部程序的运行顺序。在VBA中,Shell函数用于启动一个操作系统外壳程序,这可以是一个可执行文件、...

    Java 调用 Shell 命令

    这涉及到Java与操作系统层面的交互,其中关键的技术点包括:如何使用`OutputStreamWriter`来生成文本文件,以及如何通过Java调用Shell脚本来完成后续的文件处理任务。 #### 二、Java生成文本文件 为了生成文本文件...

    通过shell脚本循环进入目录执行命令的方法

    手动完成这项工作既耗时又容易出错,因此采用shell脚本来自动执行此任务是一个高效的选择。 首先,对于thinkphp项目,需要设置`/webserver/bbb/www/App/Runtime`目录的权限。原始脚本如下: ```bash for dir in `...

    shell of linux

    - **未声明变量的行为**:如果引用一个未声明的变量,TCShell 会给出错误消息,而 Bash 则不会。 - **提示符**:TCShell 默认的提示符是 `&gt;`, 但在实际使用中往往被设置为 `$` 后跟一个空格。 #### 四、TCShell ...

    Linux Shell编程基础

    首先,调用Shell是指在脚本开头指定执行该脚本的解释器。例如,`#!/bin/bash`声明该脚本应由Bash解释器执行。这一行必须位于脚本的第一行,称为Shebang行。调用Shell的语句可以被用来确保脚本在不同系统上用正确的...

    linux shell解析程序源码

    Linux Shell解析程序是操作系统与用户交互的核心组件之一,它接收用户输入的命令并负责执行。这个源代码提供了实现这一功能的基础框架,允许用户执行诸如`ls`、`cd`这样的基本命令,同时还支持管道(pipe)操作,这...

    liunx shell脚本编程-全网最全

    * shell 函数的调用:函数可以被多次调用,实现代码的重用。 * shell 函数变量的作用域:函数中的变量可以在局部和全局中使用。 5. Linux Shell 脚本编程实践 Linux Shell 脚本编程可以应用于各种场景,例如系统...

    百度面试题 shell

    接着,我们使用循环并发执行每个任务,并在任务完成后向管道中写入一个占位符。最后,使用`wait`命令确保所有后台任务完成,并清理管道文件。 ### 五、日志数据处理 题目要求处理不规范的日志数据,并统计其中的...

    C实现LinuxShell.zip

    虽然此项目未具体说明,但这是Shell增强用户体验的一个常见功能。 通过这个项目,学习者可以深入了解C语言如何与操作系统交互,以及Linux Shell的基本工作原理。此外,这还为开发自定义Shell或扩展现有Shell提供了...

    在Linux中“超级用户shell”的生成.pdf

    这个命令会执行一系列操作,如加载目标文件、分配内存、查找未解析的符号等,并调用`init_module`初始化模块。 3. 示例:创建“超级用户shell” 下面是一个简单的示例,演示如何编写一个内核模块,该模块可能包含...

    Python库 | adb_shell-0.2.3.tar.gz

    `adb_shell`是一个Python库,专门用于与Android设备进行交互,通过ADB(Android Debug Bridge)工具进行通信。在Android开发和调试过程中,它提供了一个高级接口,使得开发者能够更方便地执行命令、传输文件以及获取...

    shell shell java c c++

    根据提供的标题、描述以及部分内容,我们可以看出这是一篇与编程语言相关的文章,主要涉及Shell、Java、C 和 C++ 四种编程语言。虽然提供的文本内容并不具备实际意义,但基于这些关键词,我们可以构建出一系列关于这...

    Linux shell命令初学解析

    **Shell** 能够被系统中的其他应用程序调用,这使得Shell成为一个极其灵活且强大的工具。Shell程序能够根据用户的指令执行相应的操作,并将结果反馈给用户。 #### 硬件与软件结构 在Linux系统中,硬件、内核、...

    linux下的shell解析器

    在Linux操作系统中,Shell是一种命令行解释器,它充当用户与操作系统内核之间的接口,允许用户通过文本命令来执行各种操作。"Linux下的shell解析器"这个主题涉及到的是如何理解和使用这种工具,尤其是如何实现其基本...

    Shell 脚本简要介绍 .docx

    Shell脚本是在Linux或Unix操作系统中使用的一种自动化脚本语言,其主要目的是帮助系统管理员轻松完成日常任务的自动化处理。与Windows下的批处理文件(.bat)类似,Shell脚本能够将一系列命令封装在一个文件中,从而...

    shell经验分享.doc

    shell脚本支持流程控制结构,如`if`、`for`、`while`循环,这使得脚本能够根据条件执行不同的代码块。例如,`if [ condition ]; then commands; fi`允许基于条件的分支执行。 #### 常用Unix命令与文件操作 shell...

    Shell脚本调试技术

    `变量则保存了上一个命令的退出状态,0表示成功,非0表示失败。这些变量可以结合`trap`和`echo`一起使用,为调试提供更丰富的上下文信息。 除了上述技术,还有一些其他技巧可以帮助调试Shell脚本,比如使用`tee`...

    K shell基础

    6. **PATH 中的可执行程序**:最后,如果前面的步骤都未匹配到命令,则 shell 会在 PATH 环境变量指定的目录中查找可执行程序。 #### 三、找到命令的根源 - 使用命令 `whence -v command` 或 `type command` 来...

    博乐安全网远程CmdShell远程控制匿名管道

    "创建匿名管道"是实现这一功能的第一步,它涉及到系统调用,如CreateNamedPipe或CreatePipe,以创建一个可读写的数据通道。这个管道可以用来传递命令执行请求和响应。 "获取启动信息_"可能指的是获取被控制端的系统...

Global site tag (gtag.js) - Google Analytics