shell远程执行命令
ssh主要参数说明
-l 指定登入用户
-p 设置端口号
-f 后台运行,并推荐加上 -n 参数
-n 将标准输入重定向到 /dev/null,防止读取标准输入
-N 不执行远程命令,只做端口转发
-q 安静模式,忽略一切对话和错误提示
-T 禁用伪终端配置
#!/bin/sh HOST_LIST="host1 host2 host3 host4" SSH_PORT=2202 for loop in $HOST_LIST do echo "executing in $loop:" ssh -p $SSH_PORT $loop "$1"
#ssh -f -p $SSH_PORT $loop "$1" &
echo done
调用 tar zxvf /root/pat.tar.gz -C /home
在本地调用远程脚本
$ ssh -l oracle r7 '/tmp/b.sh &'
注意以下几点:
&表示后台执行,也可以不加;
脚本要拥有执行权限;
如果远程脚本 b.sh 中使用了文件,文件必须要写全路径,不然的话,默认为指定用户的home目录,而非当前目录。
使用管道模拟并发
#!/usr/bin/ksh # SCRIPT: ptest.sh # AUTHOR: Ray001 # DATE: 2008/10/03 # REV: 2.0 # For STUDY # # PURPOSE: # 实现进程并发,提高执行效率,同时能记录每个执行失败的子进程信息 #定义并发进程数量 PARALLEL=3 #定义临时管道文件名 TMPFILE=$.fifo #定义导出配置文件全路径名 CMD_CFG=$HOME/cfg/ptest.cfg #定义失败标识文件 FAILURE_FLAG=failure.log ####################### 函数定义 ######################## # 中断时kill子进程 function trap_exit { kill -9 0 } # 通用执行函数 exec_cmd() { # 此处为实际需要执行的命令,本例中用sleep做示例 sleep ${1} if [ $? -ne 0 ] then echo "命令执行失败" return 1 fi } trap 'trap_exit; exit 2' 1 2 3 15 #清理失败标识文件 rm -f ${FAILURE_FLAG} #为并发进程创建相应个数的占位 mkfifo $TMPFILE exec 4<>$TMPFILE rm -f $TMPFILE { count=$PARALLEL while [ $count -gt 0 ] do echo let count=$count-1 done } >&4 #从任务列表 seq 中按次序获取每一个任务 while read SEC do read <&4 ( exec_cmd ${SEC} || echo ${SEC}>>${FAILURE_FLAG} ; echo >&4 ) & done<$CMD_CFG wait exec 4>&- #并发进程结束后判断是否全部成功 if [ -f ${FAILURE_FLAG} ] then exit 1 else exit 0 fi