编写shell脚本将VPS上的数据备份到Dropbox网盘的方法

| 收藏本文 下载本文 作者:pai

下面小编为大家带来编写shell脚本将VPS上的数据备份到Dropbox网盘的方法(共含2篇),希望大家能够受用!同时,但愿您也能像本文投稿人“pai”一样,积极向本站投稿分享好文章。

编写shell脚本将VPS上的数据备份到Dropbox网盘的方法

篇1:编写shell脚本将VPS上的数据备份到Dropbox网盘的方法

这篇文章主要介绍了编写shell脚本将VPS上的数据备份到Dropbox网盘的方法,注意Dropbox在国内访问的网络相关问题,需要的朋友可以参考下

看到有人用dropbox备份网站数据,所以今天也试了一下,记得以前是一个python脚本,这是用的是bash 脚本,利用dropbox的api来上传下载的,很方便,脚本的地址是Dropbox-Uploader/dropbox_uploader.sh at master ・ andreafabrizi/Dropbox-Uploader ・ GitHub ,感谢作者分享这个脚本,

可以到git下载dropbox_uploader.sh,地址为:github.com/andreafabrizi/Dropbox-Uploader

或者也可以直接拷贝代码,保存为dropbox_uploader.sh,注意拷贝的时候最好是复制到文本编辑器里面,如notepad++之类的

#!/usr/bin/env bash## Dropbox Uploader## Copyright (C) - Andrea Fabrizi ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.##Default configuration fileCONFIG_FILE=~/.dropbox_uploader#Default chunk size in Mb for the upload process#It is recommended to increase this value only if you have enough free space on your /tmp partition#Lower values may increase the number of http requestsCHUNK_SIZE=4#Curl location#If not set, curl will be searched into the $PATH#CURL_BIN=“/usr/bin/curl”#Default valuesTMP_DIR=“/tmp”DEBUG=0QUIET=0SHOW_PROGRESSBAR=0SKIP_EXISTING_FILES=0ERROR_STATUS=0#Don‘t edit these...API_REQUEST_TOKEN_URL=“api.dropbox.com/1/oauth/request_token”API_USER_AUTH_URL=“www2.dropbox.com/1/oauth/authorize”API_ACCESS_TOKEN_URL=“api.dropbox.com/1/oauth/access_token”API_CHUNKED_UPLOAD_URL=“api-content.dropbox.com/1/chunked_upload”API_CHUNKED_UPLOAD_COMMIT_URL=“api-content.dropbox.com/1/commit_chunked_upload”API_UPLOAD_URL=“api-content.dropbox.com/1/files_put”API_DOWNLOAD_URL=“api-content.dropbox.com/1/files”API_DELETE_URL=“api.dropbox.com/1/fileops/delete”API_MOVE_URL=“api.dropbox.com/1/fileops/move”API_COPY_URL=“api.dropbox.com/1/fileops/copy”API_METADATA_URL=“api.dropbox.com/1/metadata”API_INFO_URL=“api.dropbox.com/1/account/info”API_MKDIR_URL=“api.dropbox.com/1/fileops/create_folder”API_SHARES_URL=“api.dropbox.com/1/shares”APP_CREATE_URL=“www2.dropbox.com/developers/apps”RESPONSE_FILE=“$TMP_DIR/du_resp_$RANDOM”CHUNK_FILE=“$TMP_DIR/du_chunk_$RANDOM”TEMP_FILE=“$TMP_DIR/du_tmp_$RANDOM”BIN_DEPS=“sed basename date grep stat dd mkdir”VERSION=“0.14”umask 077#Check the shellif [ -z “$BASH_VERSION” ]; then echo -e “Error: this script. requires the BASH shell!” exit 1fishopt -s nullglob #Bash allows filename patterns which match no files to expand to a null string, rather than themselvesshopt -s dotglob #Bash includes filenames beginning with a “.” in the results of filename expansion#Look for optional config file parameterwhile getopts “:qpskdf:” opt; do case $opt in f) CONFIG_FILE=$OPTARG ;; d) DEBUG=1 ;; q) QUIET=1 ;; p) SHOW_PROGRESSBAR=1 ;; k) CURL_ACCEPT_CERTIFICATES=“-k” ;; s) SKIP_EXISTING_FILES=1 ;; \?) echo “Invalid option: -$OPTARG” >&2 exit 1 ;; :) echo “Option -$OPTARG requires an argument.” >&2 exit 1 ;; esacdoneif [[ $DEBUG != 0 ]]; then echo $VERSION set -x RESPONSE_FILE=“$TMP_DIR/du_resp_debug”fiif [[ $CURL_BIN == “” ]]; then BIN_DEPS=“$BIN_DEPS curl” CURL_BIN=“curl”fi#Dependencies checkwhich $BIN_DEPS >/dev/nullif [[ $? != 0 ]]; then for i in $BIN_DEPS; do which $i >/dev/null ||NOT_FOUND=“$i $NOT_FOUND” done echo -e “Error: Required program could not be found: $NOT_FOUND” exit 1fi#Check if readlink is installed and supports the -m option#It‘s not necessary, so no problem if it‘s not installedwhich readlink >/dev/nullif [[ $? == 0 && $(readlink -m “//test” 2>/dev/null) == “/test” ]]; then HAVE_READLINK=1else HAVE_READLINK=0fi#Forcing to use the builtin printf, if it‘s present, because it‘s better#otherwise the external printf program will be used#Note that the external printf command can cause character encoding issues!builtin printf “” 2>/dev/nullif [[ $? == 0 ]]; then PRINTF=“builtin printf” PRINTF_OPT=“-v o”else PRINTF=$(which printf) if [[ $? != 0 ]]; then echo -e “Error: Required program could not be found: printf” fi PRINTF_OPT=“”fi#Print the message based on $QUIET variablefunction print{ if [[ $QUIET == 0 ]]; then echo -ne “$1”; fi}#Returns unix timestampfunction utime{ echo $(date +%s)}#Remove temporary filesfunction remove_temp_files{ if [[ $DEBUG == 0 ]]; then rm -fr “$RESPONSE_FILE” rm -fr “$CHUNK_FILE” rm -fr “$TEMP_FILE” fi}#Returns the file size in bytes# generic GNU Linux: linux-gnu# windows cygwin: cygwin# raspberry pi: linux-gnueabihf# macosx:darwin10.0# freebsd:FreeBSD# qnap: linux-gnueabi# iOS: darwin9function file_size{ #Some embedded linux devices if [[ $OSTYPE == “linux-gnueabi” || $OSTYPE == “linux-gnu” ]]; then stat -c “%s” “$1” return #Generic Unix elif [[ ${OSTYPE:0:5} == “linux” || $OSTYPE == “cygwin” || ${OSTYPE:0:7} == “solaris” ]]; then stat --format=“%s” “$1” return #BSD, OSX and other OSs else stat -f “%z” “$1” return fi}#Usagefunction usage{ echo -e “Dropbox Uploader v$VERSION” echo -e “Andrea Fabrizi - andrea.fabrizi@gmail.com\n” echo -e “Usage: $0 COMMAND [PARAMETERS]...” echo -e “\nCommands:” echo -e “\t upload ” echo -e “\t download [LOCAL_FILE/DIR]” echo -e “\t delete ” echo -e “\t move ” echo -e “\t copy ” echo -e “\t mkdir ” echo -e “\t list [REMOTE_DIR]” echo -e “\t share ” echo -e “\t info” echo -e “\t unlink” echo -e “\nOptional parameters:” echo -e “\t-f Load the configuration file from a specific file” echo -e “\t-sSkip already existing files when download/upload. Default: Overwrite” echo -e “\t-dEnable DEBUG mode” echo -e “\t-qQuiet mode. Don‘t show messages” echo -e “\t-pShow cURL progress meter” echo -e “\t-kDoesn‘t check for SSL certificates (insecure)” echo -en “\nFor more info and examples, please see the README file.\n\n” remove_temp_files exit 1}#Check the curl exit codefunction check_http_response{ CODE=$? #Checking curl exit code case $CODE in #OK 0) ;; #Proxy error 5)print “\nError: Couldn‘t resolve proxy. The given proxy host could not be resolved.\n”remove_temp_filesexit 1 ;; #Missing CA certificates 60|58)print “\nError: cURL is not able to performs peer SSL certificate verification.\n”print “Please, install the default ca-certificates bundle.\n”print “To do this in a Debian/Ubuntu based system, try:\n”print “ sudo apt-get install ca-certificates\n\n”print “If the problem persists, try to use the -k option (insecure).\n”remove_temp_filesexit 1 ;; 6)print “\nError: Couldn‘t resolve host.\n”remove_temp_filesexit 1 ;; 7)print “\nError: Couldn‘t connect to host.\n”remove_temp_filesexit 1 ;; esac #Checking response file for generic errors if grep -q “HTTP/1.1 400” “$RESPONSE_FILE”; then ERROR_MSG=$(sed -n -e ‘s/{“error”: “\([^”]*\)“}/\1/p‘ ”$RESPONSE_FILE“) case $ERROR_MSG in *access?attempt?failed?because?this?app?is?not?configured?to?have*) echo -e ”\nError: The Permission type/Access level configured doesn‘t match the DropBox App settings!\nPlease run \“$0 unlink\” and try again.“ exit 1;; esac fi}#Urlencodefunction urlencode{ local string=”${1}“ local strlen=${#string} local encoded=”“ for (( pos=0 ; pos/dev/null check_http_response #Even if the file/dir has been deleted from DropBox we receive a 200 OK response #So we must check if the file exists or if it has been deleted if grep -q ”\“is_deleted\”:“ ”$RESPONSE_FILE“; then local IS_DELETED=$(sed -n ‘s/.*”is_deleted“:.\([^,]*\).*/\1/p‘ ”$RESPONSE_FILE“) else local IS_DELETED=”false“ fi #Exits... grep -q ”^HTTP/1.1 200 OK“ ”$RESPONSE_FILE“ if [[ $? == 0 && $IS_DELETED != ”true“ ]]; then local IS_DIR=$(sed -n ‘s/^\(.*\)\”contents“:.\[.*/\1/p‘ ”$RESPONSE_FILE“) #It‘s a directory if [[ $IS_DIR != ”“ ]]; thenecho ”DIR“ #It‘s a file elseecho ”FILE“ fi #Doesn‘t exists else echo ”ERR“ fi}#Generic upload wrapper around db_upload_file and db_upload_dir functions#$1 = Local source file/dir#$2 = Remote destination file/dirfunction db_upload{ local SRC=$(normalize_path ”$1“) local DST=$(normalize_path ”$2“) #Checking if the file/dir exists if [[ ! -e $SRC && ! -d $SRC ]]; then print ” >No such file or directory: $SRC\n“ ERROR_STATUS=1 return fi #Checking if the file/dir has read permissions if [[ ! -r $SRC ]]; then print ” >Error reading file $SRC: permission denied\n“ ERROR_STATUS=1 return fi #Checking if DST it‘s a folder or if it doesn‘ exists (in this case will be the destination name) TYPE=$(db_stat ”$DST“) if [[ $TYPE == ”DIR“ ]]; then local filename=$(basename ”$SRC“) DST=”$DST/$filename“ fi #It‘s a directory if [[ -d $SRC ]]; then db_upload_dir ”$SRC“ ”$DST“ #It‘s a file elif [[ -e $SRC ]]; then db_upload_file ”$SRC“ ”$DST“ #Unsupported object... else print ” >Skipping not regular file \“$SRC\”\n“ fi}#Generic upload wrapper around db_chunked_upload_file and db_simple_upload_file#The final upload function will be choosen based on the file size#$1 = Local source file#$2 = Remote destination filefunction db_upload_file{ local FILE_SRC=$(normalize_path ”$1“) local FILE_DST=$(normalize_path ”$2“) shopt -s nocasematch #Checking not allowed file names basefile_dst=$(basename ”$FILE_DST“) if [[ $basefile_dst == ”thumbs.db“ || \ $basefile_dst == ”desktop.ini“ || \ $basefile_dst == ”.ds_store“ || \ $basefile_dst == ”icon\r“ || \ $basefile_dst == ”.dropbox“ || \ $basefile_dst == ”.dropbox.attr“ \ ]]; then print ” >Skipping not allowed file name \“$FILE_DST\”\n“ return fi shopt -u nocasematch #Checking file size FILE_SIZE=$(file_size ”$FILE_SRC“) #Checking if the file already exists TYPE=$(db_stat ”$FILE_DST“) if [[ $TYPE != ”ERR“ && $SKIP_EXISTING_FILES == 1 ]]; then print ” >Skipping already existing file \“$FILE_DST\”\n“ return fi if [[ $FILE_SIZE -gt 157286000 ]]; then #If the file is greater than 150Mb, the chunked_upload API will be used db_chunked_upload_file ”$FILE_SRC“ ”$FILE_DST“ else db_simple_upload_file ”$FILE_SRC“ ”$FILE_DST“ fi}#Simple file upload#$1 = Local source file#$2 = Remote destination filefunction db_simple_upload_file{ local FILE_SRC=$(normalize_path ”$1“) local FILE_DST=$(normalize_path ”$2“) if [[ $SHOW_PROGRESSBAR == 1 && $QUIET == 0 ]]; then CURL_PARAMETERS=”--progress-bar“ LINE_CR=”\n“ else CURL_PARAMETERS=”-s“ LINE_CR=”“ fi print ” >Uploading \“$FILE_SRC\” to \“$FILE_DST\”... $LINE_CR“ $CURL_BIN $CURL_ACCEPT_CERTIFICATES $CURL_PARAMETERS -i --globoff -o ”$RESPONSE_FILE“ --upload-file ”$FILE_SRC“ ”$API_UPLOAD_URL/$ACCESS_LEVEL/$(urlencode “$FILE_DST”)?oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM“ check_http_response #Check if grep -q ”^HTTP/1.1 200 OK“ ”$RESPONSE_FILE“; then print ”DONE\n“ else print ”FAILED\n“ print ”An error occurred requesting /upload\n“ ERROR_STATUS=1 fi}#Chunked file upload#$1 = Local source file#$2 = Remote destination filefunction db_chunked_upload_file{ local FILE_SRC=$(normalize_path ”$1“) local FILE_DST=$(normalize_path ”$2“) print ” >Uploading \“$FILE_SRC\” to \“$FILE_DST\”“ local FILE_SIZE=$(file_size ”$FILE_SRC“) local FFSET=0 local UPLOAD_ID=”“ local UPLOAD_ERROR=0 local CHUNK_PARAMS=”“ #Uploading chunks... while ([[ $OFFSET != $FILE_SIZE ]]); do let OFFSET_MB=$OFFSET/1024/1024 #Create the chunk dd if=”$FILE_SRC“ f=”$CHUNK_FILE“ bs=1048576 skip=$OFFSET_MB count=$CHUNK_SIZE 2>/dev/null #Only for the first request these parameters are not included if [[ $OFFSET != 0 ]]; thenCHUNK_PARAMS=”upload_id=$UPLOAD_ID&offset=$OFFSET“ fi #Uploading the chunk... $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o ”$RESPONSE_FILE“ --upload-file ”$CHUNK_FILE“ ”$API_CHUNKED_UPLOAD_URL?$CHUNK_PARAMS&oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM“ 2>/dev/null check_http_response #Check if grep -q ”^HTTP/1.1 200 OK“ ”$RESPONSE_FILE“; thenprint ”.“UPLOAD_ERROR=0UPLOAD_ID=$(sed -n ‘s/.*”upload_id“: *”*\([^“]*\)”*.*/\1/p‘ “$RESPONSE_FILE”)FFSET=$(sed -n ‘s/.*“offset”: *\([^}]*\).*/\1/p‘ “$RESPONSE_FILE”) elseprint “*”let UPLOAD_ERROR=$UPLOAD_ERROR+1#On error, the upload is retried for max 3 timesif [[ $UPLOAD_ERROR -gt 2 ]]; then print “ FAILED\n” print “An error occurred requesting /chunked_upload\n” ERROR_STATUS=1 returnfi fi done UPLOAD_ERROR=0 #Commit the upload while (true); do $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “upload_id=$UPLOAD_ID&oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” “$API_CHUNKED_UPLOAD_COMMIT_URL/$ACCESS_LEVEL/$(urlencode ”$FILE_DST“)” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; thenprint “.”UPLOAD_ERROR=0break elseprint “*”let UPLOAD_ERROR=$UPLOAD_ERROR+1#On error, the commit is retried for max 3 timesif [[ $UPLOAD_ERROR -gt 2 ]]; then print “ FAILED\n” print “An error occurred requesting /commit_chunked_upload\n” ERROR_STATUS=1 returnfi fi done print “ DONE\n”}#Directory upload#$1 = Local source dir#$2 = Remote destination dirfunction db_upload_dir{ local DIR_SRC=$(normalize_path “$1”) local DIR_DST=$(normalize_path “$2”) #Creatig remote directory db_mkdir “$DIR_DST” for file in “$DIR_SRC/”*; do db_upload “$file” “$DIR_DST” done}#Returns the free space on DropBox in bytesfunction db_free_quota{ $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” “$API_INFO_URL” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then quota=$(sed -n ‘s/.*“quota”: \([0-9]*\).*/\1/p‘ “$RESPONSE_FILE”) used=$(sed -n ‘s/.*“normal”: \([0-9]*\).*/\1/p‘ “$RESPONSE_FILE”) let free_quota=$quota-$used echo $free_quota else echo 0 fi}#Generic download wrapper#$1 = Remote source file/dir#$2 = Local destination file/dirfunction db_download{ local SRC=$(normalize_path “$1”) local DST=$(normalize_path “$2”) TYPE=$(db_stat “$SRC”) #It‘s a directory if [[ $TYPE == “DIR” ]]; then #If the DST folder is not specified, I assume that is the current directory if [[ $DST == “” ]]; thenDST=“.” fi #Checking if the destination directory exists if [[ ! -d $DST ]]; thenlocal basedir=“” elselocal basedir=$(basename “$SRC”) fi local DEST_DIR=$(normalize_path “$DST/$basedir”) print “ >Downloading \”$SRC\“ to \”$DEST_DIR\“... \n” print “ >Creating local directory \”$DEST_DIR\“... ” mkdir -p “$DEST_DIR” #Check if [[ $? == 0 ]]; thenprint “DONE\n” elseprint “FAILED\n”ERROR_STATUS=1return fi #Extracting directory content [...] #and replacing “}, {” with “}\n{” #I don‘t like this piece of code... but seems to be the only way to do this with SED, writing a portable code... local DIR_CONTENT=$(sed -n ‘s/.*: \[{\(.*\)/\1/p‘ “$RESPONSE_FILE” | sed ‘s/}, *{/}\{/g‘) #Extracting files and subfolders TMP_DIR_CONTENT_FILE=“${RESPONSE_FILE}_$RANDOM” echo “$DIR_CONTENT” | sed -n ‘s/.*“path”: *“\([^”]*\)“,.*”is_dir“: *\([^”]*\),.*/\1:\2/p‘ >$TMP_DIR_CONTENT_FILE #For each entry... while read -r line; dolocal FILE=${line%:*}local TYPE=${line#*:}#Removing unneeded /FILE=${FILE##*/}if [[ $TYPE == “false” ]]; then db_download_file “$SRC/$FILE” “$DEST_DIR/$FILE”else db_download “$SRC/$FILE” “$DEST_DIR”fi done < $TMP_DIR_CONTENT_FILE rm -fr $TMP_DIR_CONTENT_FILE #It‘s a file elif [[ $TYPE == “FILE” ]]; then #Checking DST if [[ $DST == “” ]]; thenDST=$(basename “$SRC”) fi #If the destination is a directory, the file will be download into if [[ -d $DST ]]; thenDST=“$DST/$SRC” fi db_download_file “$SRC” “$DST” #Doesn‘t exists else print “ >No such file or directory: $SRC\n” ERROR_STATUS=1 return fi}#Simple file download#$1 = Remote source file#$2 = Local destination filefunction db_download_file{ local FILE_SRC=$(normalize_path “$1”) local FILE_DST=$(normalize_path “$2”) if [[ $SHOW_PROGRESSBAR == 1 && $QUIET == 0 ]]; then CURL_PARAMETERS=“--progress-bar” LINE_CR=“\n” else CURL_PARAMETERS=“-s” LINE_CR=“” fi #Checking if the file already exists if [[ -e $FILE_DST && $SKIP_EXISTING_FILES == 1 ]]; then print “ >Skipping already existing file \”$FILE_DST\“\n” return fi #Creating the empty file, that for two reasons: #1) In this way I can check if the destination file is writable or not #2) Curl doesn‘t automatically creates files with 0 bytes size dd if=/dev/zero f=“$FILE_DST” count=0 2>/dev/null if [[ $? != 0 ]]; then print “ >Error writing file $FILE_DST: permission denied\n” ERROR_STATUS=1 return fi print “ >Downloading \”$FILE_SRC\“ to \”$FILE_DST\“... $LINE_CR” $CURL_BIN $CURL_ACCEPT_CERTIFICATES $CURL_PARAMETERS --globoff -D “$RESPONSE_FILE” -o “$FILE_DST” “$API_DOWNLOAD_URL/$ACCESS_LEVEL/$(urlencode ”$FILE_SRC“)?oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then print “DONE\n” else print “FAILED\n” rm -fr “$FILE_DST” ERROR_STATUS=1 return fi}#Prints account infofunction db_account_info{ print “Dropbox Uploader v$VERSION\n\n” print “ >Getting info... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” “$API_INFO_URL” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then name=$(sed -n ‘s/.*“display_name”: “\([^”]*\).*/\1/p‘ “$RESPONSE_FILE”) echo -e “\n\nName:\t$name” uid=$(sed -n ‘s/.*“uid”: \([0-9]*\).*/\1/p‘ “$RESPONSE_FILE”) echo -e “UID:\t$uid” email=$(sed -n ‘s/.*“email”: “\([^”]*\).*/\1/p‘ “$RESPONSE_FILE”) echo -e “Email:\t$email” quota=$(sed -n ‘s/.*“quota”: \([0-9]*\).*/\1/p‘ “$RESPONSE_FILE”) let quota_mb=$quota/1024/1024 echo -e “Quota:\t$quota_mb Mb” used=$(sed -n ‘s/.*“normal”: \([0-9]*\).*/\1/p‘ “$RESPONSE_FILE”) let used_mb=$used/1024/1024 echo -e “Used:\t$used_mb Mb” let free_mb=($quota-$used)/1024/1024 echo -e “Free:\t$free_mb Mb” echo “” else print “FAILED\n” ERROR_STATUS=1 fi}#Account unlinkfunction db_unlink{ echo -ne “Are you sure you want unlink this script. from your Dropbox account? [y/n]” read answer if [[ $answer == “y” ]]; then rm -fr “$CONFIG_FILE” echo -ne “DONE\n” fi}#Delete a remote file#$1 = Remote file to deletefunction db_delete{ local FILE_DST=$(normalize_path “$1”) print “ >Deleting \”$FILE_DST\“... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM&root=$ACCESS_LEVEL&path=$(urlencode ”$FILE_DST“)” “$API_DELETE_URL” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then print “DONE\n” else print “FAILED\n” ERROR_STATUS=1 fi}#Move/Rename a remote file#$1 = Remote file to rename or move#$2 = New file name or locationfunction db_move{ local FILE_SRC=$(normalize_path “$1”) local FILE_DST=$(normalize_path “$2”) TYPE=$(db_stat “$FILE_DST”) #If the destination it‘s a directory, the source will be moved into it if [[ $TYPE == “DIR” ]]; then local filename=$(basename “$FILE_SRC”) FILE_DST=$(normalize_path “$FILE_DST/$filename”) fi print “ >Moving \”$FILE_SRC\“ to \”$FILE_DST\“ ... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM&root=$ACCESS_LEVEL&from_path=$(urlencode ”$FILE_SRC“)&to_path=$(urlencode ”$FILE_DST“)” “$API_MOVE_URL” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then print “DONE\n” else print “FAILED\n” ERROR_STATUS=1 fi}#Copy a remote file to a remote location#$1 = Remote file to rename or move#$2 = New file name or locationfunction db_copy{ local FILE_SRC=$(normalize_path “$1”) local FILE_DST=$(normalize_path “$2”) TYPE=$(db_stat “$FILE_DST”) #If the destination it‘s a directory, the source will be copied into it if [[ $TYPE == “DIR” ]]; then local filename=$(basename “$FILE_SRC”) FILE_DST=$(normalize_path “$FILE_DST/$filename”) fi print “ >Copying \”$FILE_SRC\“ to \”$FILE_DST\“ ... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM&root=$ACCESS_LEVEL&from_path=$(urlencode ”$FILE_SRC“)&to_path=$(urlencode ”$FILE_DST“)” “$API_COPY_URL” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then print “DONE\n” else print “FAILED\n” ERROR_STATUS=1 fi}#Create a new directory#$1 = Remote directory to createfunction db_mkdir{ local DIR_DST=$(normalize_path “$1”) print “ >Creating Directory \”$DIR_DST\“... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM&root=$ACCESS_LEVEL&path=$(urlencode ”$DIR_DST“)” “$API_MKDIR_URL” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then print “DONE\n” elif grep -q “^HTTP/1.1 403 Forbidden” “$RESPONSE_FILE”; then print “ALREADY EXISTS\n” else print “FAILED\n” ERROR_STATUS=1 fi}#List remote directory#$1 = Remote directoryfunction db_list{ local DIR_DST=$(normalize_path “$1”) print “ >Listing \”$DIR_DST\“... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” “$API_METADATA_URL/$ACCESS_LEVEL/$(urlencode ”$DIR_DST“)?oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then local IS_DIR=$(sed -n ‘s/^\(.*\)\“contents”:.\[.*/\1/p‘ “$RESPONSE_FILE”) #It‘s a directory if [[ $IS_DIR != “” ]]; thenprint “DONE\n”#Extracting directory content [...]#and replacing “}, {” with “}\n{”#I don‘t like this piece of code... but seems to be the only way to do this with SED, writing a portable code...local DIR_CONTENT=$(sed -n ‘s/.*: \[{\(.*\)/\1/p‘ “$RESPONSE_FILE” | sed ‘s/}, *{/}\{/g‘)#Converting escaped quotes to unicode formatecho “$DIR_CONTENT” | sed ‘s/\\“/\\u0022/‘ >”$TEMP_FILE“#Extracting files and subfoldersrm -fr ”$RESPONSE_FILE“while read -r line; do local FILE=$(echo ”$line“ | sed -n ‘s/.*”path“: *”\([^“]*\)”.*/\1/p‘) local IS_DIR=$(echo “$line” | sed -n ‘s/.*“is_dir”: *\([^,]*\).*/\1/p‘) local SIZE=$(echo “$line” | sed -n ‘s/.*“bytes”: *\([0-9]*\).*/\1/p‘) echo -e “$FILE:$IS_DIR;$SIZE” >>“$RESPONSE_FILE”done < “$TEMP_FILE”#Looking for the biggest file size#to calculate the padding to uselocal padding=0while read -r line; do local FILE=${line%:*} local META=${line##*:} local SIZE=${META#*;} if [[ ${#SIZE} -gt $padding ]]; then padding=${#SIZE} fidone < “$RESPONSE_FILE”#For each entry, printing directories...while read -r line; do local FILE=${line%:*} local META=${line##*:} local TYPE=${META%;*} local SIZE=${META#*;} #Removing unneeded / FILE=${FILE##*/} if [[ $TYPE != “false” ]]; then FILE=$(echo -e “$FILE”) $PRINTF “ [D] %-${padding}s %s\n” “$SIZE” “$FILE” fidone < “$RESPONSE_FILE”#For each entry, printing files...while read -r line; do local FILE=${line%:*} local META=${line##*:} local TYPE=${META%;*} local SIZE=${META#*;} #Removing unneeded / FILE=${FILE##*/} if [[ $TYPE == “false” ]]; then FILE=$(echo -e “$FILE”) $PRINTF “ [F] %-${padding}s %s\n” “$SIZE” “$FILE” fidone < “$RESPONSE_FILE” #It‘s a file elseprint “FAILED: $DIR_DST is not a directory!\n”ERROR_STATUS=1 fi else print “FAILED\n” ERROR_STATUS=1 fi}#Share remote file#$1 = Remote filefunction db_share{ local FILE_DST=$(normalize_path “$1”) $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” “$API_SHARES_URL/$ACCESS_LEVEL/$(urlencode ”$FILE_DST“)?oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_ACCESS_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM&short_url=false” 2>/dev/null check_http_response #Check if grep -q “^HTTP/1.1 200 OK” “$RESPONSE_FILE”; then print “ >Share link: ” echo $(sed -n ‘s/.*“url”: “\([^”]*\).*/\1/p‘ “$RESPONSE_FILE”) else print “FAILED\n” ERROR_STATUS=1 fi}#################### SETUP #####################CHECKING FOR AUTH FILEif [[ -e $CONFIG_FILE ]]; then #Loading data... and change old format config if necesary. source “$CONFIG_FILE” 2>/dev/null || { sed -i‘‘ ‘s/:/=/‘ “$CONFIG_FILE” && source “$CONFIG_FILE” 2>/dev/null } #Checking the loaded data if [[ $APPKEY == “” || $APPSECRET == “” || $OAUTH_ACCESS_TOKEN_SECRET == “” || $OAUTH_ACCESS_TOKEN == “” ]]; then echo -ne “Error loading data from $CONFIG_FILE...\n” echo -ne “It is recommended to run $0 unlink\n” remove_temp_files exit 1 fi #Back compatibility with previous Dropbox Uploader versions if [[ $ACCESS_LEVEL == “” ]]; then ACCESS_LEVEL=“dropbox” fi#NEW SETUP...else echo -ne “\n This is the first time you run this script.\n\n” echo -ne “ 1) Open the following URL in your Browser, and log in using your account: $APP_CREATE_URL\n” echo -ne “ 2) Click on \”Create App\“, then select \”Dropbox API app\“\n” echo -ne “ 3) Select \”Files and datastores\“\n” echo -ne “ 4) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder\n” echo -ne “ 5) Enter the \”App Name\“ that you prefer (e.g. MyUploader$RANDOM$RANDOM$RANDOM)\n\n” echo -ne “ Now, click on the \”Create App\“ button.\n\n” echo -ne “ When your new App is successfully created, please type the\n” echo -ne “ App Key, App Secret and the Permission type shown in the confirmation page:\n\n” #Getting the app key and secret from the user while (true); do echo -n “ # App key: ” read APPKEY echo -n “ # App secret: ” read APPSECRET echo -n “ # Permission type, App folder or Full Dropbox [a/f]: ” read ACCESS_LEVEL if [[ $ACCESS_LEVEL == “a” ]]; thenACCESS_LEVEL=“sandbox”ACCESS_MSG=“App Folder” elseACCESS_LEVEL=“dropbox”ACCESS_MSG=“Full Dropbox” fi echo -ne “\n >App key is $APPKEY, App secret is $APPSECRET and Access level is $ACCESS_MSG. Looks ok? [y/n]: ” read answer if [[ $answer == “y” ]]; thenbreak; fi done #TOKEN REQUESTS echo -ne “\n >Token request... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” “$API_REQUEST_TOKEN_URL” 2>/dev/null check_http_response OAUTH_TOKEN_SECRET=$(sed -n ‘s/oauth_token_secret=\([a-z A-Z 0-9]*\).*/\1/p‘ “$RESPONSE_FILE”) OAUTH_TOKEN=$(sed -n ‘s/.*oauth_token=\([a-z A-Z 0-9]*\)/\1/p‘ “$RESPONSE_FILE”) if [[ $OAUTH_TOKEN != “” && $OAUTH_TOKEN_SECRET != “” ]]; then echo -ne “OK\n” else echo -ne “ FAILED\n\n Please, check your App key and secret...\n\n” remove_temp_files exit 1 fi while (true); do #USER AUTH echo -ne “\n Please open the following URL in your browser, and allow Dropbox Uploader\n” echo -ne “ to access your DropBox folder:\n\n -->${API_USER_AUTH_URL}?oauth_token=$OAUTH_TOKEN\n” echo -ne “\nPress enter when done...\n” read #API_ACCESS_TOKEN_URL echo -ne “ >Access Token request... ” $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o “$RESPONSE_FILE” --data “oauth_consumer_key=$APPKEY&oauth_token=$OAUTH_TOKEN&oauth_signature_method=PLAINTEXT&oauth_signature=$APPSECRET%26$OAUTH_TOKEN_SECRET&oauth_timestamp=$(utime)&oauth_nonce=$RANDOM” “$API_ACCESS_TOKEN_URL” 2>/dev/null check_http_response OAUTH_ACCESS_TOKEN_SECRET=$(sed -n ‘s/oauth_token_secret=\([a-z A-Z 0-9]*\)&.*/\1/p‘ “$RESPONSE_FILE”) OAUTH_ACCESS_TOKEN=$(sed -n ‘s/.*oauth_token=\([a-z A-Z 0-9]*\)&.*/\1/p‘ “$RESPONSE_FILE”) OAUTH_ACCESS_UID=$(sed -n ‘s/.*uid=\([0-9]*\)/\1/p‘ “$RESPONSE_FILE”) if [[ $OAUTH_ACCESS_TOKEN != “” && $OAUTH_ACCESS_TOKEN_SECRET != “” && $OAUTH_ACCESS_UID != “” ]]; thenecho -ne “OK\n”#Saving data in new format, compatible with source command.echo “APPKEY=$APPKEY” >“$CONFIG_FILE”echo “APPSECRET=$APPSECRET” >>“$CONFIG_FILE”echo “ACCESS_LEVEL=$ACCESS_LEVEL” >>“$CONFIG_FILE”echo “OAUTH_ACCESS_TOKEN=$OAUTH_ACCESS_TOKEN” >>“$CONFIG_FILE”echo “OAUTH_ACCESS_TOKEN_SECRET=$OAUTH_ACCESS_TOKEN_SECRET” >>“$CONFIG_FILE”echo -ne “\n Setup completed!\n”break elseprint “ FAILED\n”ERROR_STATUS=1 fi done; remove_temp_files exit $ERROR_STATUSfi#################### START ####################COMMAND=${@:$OPTIND:1}ARG1=${@:$OPTIND+1:1}ARG2=${@:$OPTIND+2:1}let argnum=$#-$OPTIND#CHECKING PARAMS VALUEScase $COMMAND in upload) if [[ $argnum -lt 2 ]]; thenusage fi FILE_DST=${@:$#:1} for (( i=$OPTIND+1; i<$#; i++ )); doFILE_SRC=${@:$i:1}db_upload “$FILE_SRC” “/$FILE_DST” done ;; download) if [[ $argnum -lt 1 ]]; thenusage fi FILE_SRC=$ARG1 FILE_DST=$ARG2 db_download “/$FILE_SRC” “$FILE_DST” ;; share) if [[ $argnum -lt 1 ]]; thenusage fi FILE_DST=$ARG1 db_share “/$FILE_DST” ;; info) db_account_info ;; delete|remove) if [[ $argnum -lt 1 ]]; thenusage fi FILE_DST=$ARG1 db_delete “/$FILE_DST” ;; move|rename) if [[ $argnum -lt 2 ]]; thenusage fi FILE_SRC=$ARG1 FILE_DST=$ARG2 db_move “/$FILE_SRC” “/$FILE_DST” ;; copy) if [[ $argnum -lt 2 ]]; thenusage fi FILE_SRC=$ARG1 FILE_DST=$ARG2 db_copy “/$FILE_SRC” “/$FILE_DST” ;; mkdir) if [[ $argnum -lt 1 ]]; thenusage fi DIR_DST=$ARG1 db_mkdir “/$DIR_DST” ;; list) DIR_DST=$ARG1 #Checking DIR_DST if [[ $DIR_DST == “” ]]; thenDIR_DST=“/” fi db_list “/$DIR_DST” ;; unlink) db_unlink ;; *) if [[ $COMMAND != “” ]]; thenprint “Error: Unknown command: $COMMAND\n\n”ERROR_STATUS=1 fi usage ;;esacremove_temp_filesexit $ERROR_STATUS

第一次使用,这个脚本会给你指导,告诉你去哪里获得dropbox的 API key ,

因为只有配置好了 API key ,这样才能授权给脚本应用进入你的dropbox目录

篇2:编写Bash Shell通过gnuplot绘制系统性能数据图的方法

这篇文章主要介绍了编写Bash Shell通过gnuplot绘制系统性能数据图的方法,做到可视化数据收集,需要的朋友可以参考下

使用步骤:

1.设置一个定时任何 执行getperf.sh,采集性能数据

2.将采集到性能数据文件,如:192.168.1.1.tar.gz 解压

3.将性能分析的脚步performance_analyse.sh 放到解压后的目录中

4.安装gnuplot程序(这里下载)

5.将字体文件夹,拷贝到/usr/share/fonts/目录

6.直接运行 bash performance_analyse.sh

getperf.sh脚本内容如下:

##################################################说明:# 定义时间TIMES参数,表示采集的次数,# 采集时间 = TIMES * INTERVAL#eg:# TIMES=180 , INTERVAL=10 采集时间就是半小时###################################################!/bin/bashTIMES=3600INTERVAL=2PWD=`pwd`TIME=`date “+%F %H:%M:%S”`TAR=`whereis tar|awk -F “:” ‘{print $2}‘|awk ‘{print $1}‘`SAR=`whereis sar|awk -F “:” ‘{print $2}‘|awk ‘{print $1}‘`IOSTAT=`whereis iostat|awk -F “:” ‘{print $2}‘|awk ‘{print $1}‘`# Check Moniter ToolSysInfo(){ echo “sysip : $SYSIP”|tee $PWD/$SYSIP/sysinfo echo “starttime : $TIME” |tee -a $PWD/$SYSIP/sysinfo /sbin/ifconfig >>$PWD/$SYSIP/sysinfo echo “===================================” >>$PWD/$SYSIP/sysinfo /usr/sbin/dmidecode >>$PWD/$SYSIP/sysinfo echo “===================================” >>$PWD/$SYSIP/sysinfo /bin/cat /proc/cpuinfo >>$PWD/$SYSIP/sysinfo echo “===================================” >>$PWD/$SYSIP/sysinfo /sbin/fdisk -l >>$PWD/$SYSIP/sysinfo echo “===================================” >>$PWD/$SYSIP/sysinfo /bin/df -Th >>$PWD/$SYSIP/sysinfo echo “===================================” >>$PWD/$SYSIP/sysinfo /usr/bin/free -m >>$PWD/$SYSIP/sysinfo echo “===================================” >>$PWD/$SYSIP/sysinfo echo “”}CheckEnv(){ PUB_IP=`/sbin/ifconfig |grep “inet addr” | awk -F: ‘{print $2}‘| awk ‘{print $1}‘|grep -v “172\.\|10\.\|127\.\|192\.”|sed -n 1p` PRI_IP=`/sbin/ifconfig |grep “inet addr” | awk -F: ‘{print $2}‘| awk ‘{print $1}‘|grep “10\.\|127\.\|192\.”|sed -n 1p` if [ “snda$PUB_IP” == “snda” ];then SYSIP=$PRI_IP else SYSIP=$PUB_IP fi if [ -d $PWD/$SYSIP ];then rm -rf $PWD/$SYSIP fi mkdir -p $PWD/$SYSIP if ! grep iostat /usr/bin/iostat ;then yum -y install sysstat fi}GetPerf(){ CPUUSAGE=“$PWD/$SYSIP/cpuusage.log” MEMUSAGE=“$PWD/$SYSIP/memusage.log” DISKUSAGE=“$PWD/$SYSIP/diskusage.log” NETWORK=“$PWD/$SYSIP/network.log” $SAR -P ALL $INTERVAL $TIMES>>$CPUUSAGE & $IOSTAT -dkx $INTERVAL $TIMES>>$DISKUSAGE & $SAR -n DEV $INTERVAL $TIMES>>$NETWORK & $SAR -r $INTERVAL $TIMES>>$MEMUSAGE & for ((i=0;i<$TIMES;i++)) do sleep $INTERVAL done}CheckEnvSysInfoGetPerf#在同一台机器上第二次采集数据时,会删除之前采集的数据,重新采集#采集完成之后,会生产一个以 IP.tar.gz的压缩包,

编写Bash Shell通过gnuplot绘制系统性能数据图的方法

。将这个压缩包,放到#分析脚本performance_analyse.sh 的同级目录。if [ -d $PWD/$SYSIP ];then cd $PWD rm -f $SYSIP.tar.gz tar zcvf $SYSIP.tar.gz $SYSIPfi

performance_analyse.sh脚本内容如下:

################################################### 这个脚本的作用是处理由性能采集脚本收集到的性能数据#然后使用gunplot生产直观的性能图。###################################################!/bin/bashSysInfo(){ local file=$1 local productname=“unknow” local cpumodel=“unknow” local cpucore=“unknow” local cpumhz=“unknow” local physical=“unknow” local realcpucore=“unknow” local diskpart=“unknow” local memory=“unknow” ipaddr=`cat $file |grep -i “net addr”|grep -v “127”` productname=`cat $file |grep -i “product name”` cpumodel=`cat $file |grep -i “model name”|uniq -d` cpucore=`cat $file |grep “processor”|wc -l` cpumhz=`cat $file |grep -i “cpu MHz”|uniq -d` physical=`cat $file |grep -i “physical id”|sort -n|uniq -d|wc -l` realcpucore=`cat $file |grep -i “cpu cores”|uniq -d|awk -F “:” ‘{print $2}‘` memory=` cat $file |grep -i -EB1 “mem:”` diskpart=`cat $file |grep -i “disk”|grep -E “[shv][d][a-z]”` echo “System Information:”|tee -a $REPORTFILE echo “IP address:”|tee -a $REPORTFILE echo -e “$ipaddr”|tee -a $REPORTFILE echo “$productname” |tee -a $REPORTFILE echo -e “\t$cpumodel” |tee -a $REPORTFILE echo -e “\tCPU cores\t:$cpucore”|tee -a $REPORTFILE echo -e “\t$cpumhz”|tee -a $REPORTFILE echo -e “\tPhysical cpu number:$physical”|tee -a $REPORTFILE echo -e “\tEach CPU real core:$realcpucore”|tee -a $REPORTFILE echo “$diskpart”|tee -a $REPORTFILE echo -e “Memory(MB):\n$memory”|tee -a $REPORTFILE}CpuAllUsage(){ local file=$1 cat $file|grep -i “all”|grep -v -i -E “average|linux|system” >$GNUPLOTFOLDER/sar_cpu.$$ TITLE=`cat $file |sed “/^$/d”|grep -v -i “average|linux”|sed 1d|sed -n 1p` local SOURCE_SAR_CPU=“$GNUPLOTFOLDER/sar_cpu.$$” local USER_UASGE=`echo $TITLE |awk ‘{print $3}‘` local NICE_UASGE=`echo $TITLE |awk ‘{print $4}‘` local SYSTEM_UASGE=`echo $TITLE |awk ‘{print $5}‘` local IOWAIT_UASGE=`echo $TITLE |awk ‘{print $6}‘` local STEAL_UASGE=`echo $TITLE |awk ‘{print $7}‘` local IDLE_UASGE=`echo $TITLE |awk ‘{print $8}‘` local cpuusagemax=`cat $SOURCE_SAR_CPU|awk ‘{print $3+$4+$5+$6+$7}‘|sort -r|sed -n 1p` local Tmp_ylable=`echo $cpuusagemax|awk -F “.” ‘{print $1}‘` local ylable=`echo $Tmp_ylable+5|bc` local cpuusagemin=`cat $SOURCE_SAR_CPU|awk ‘{print $3+$4+$5+$6+$7}‘|sort|sed -n 1p` local cpuusageavg=`awk ‘BEGIN{total=0}{total+=$8}END{print 100-total/NR}‘ $SOURCE_SAR_CPU` echo “`date ‘+%F %H:%M:%S‘`: CPU Performance analysis” |tee -a $REPORTFILE echo -e “\t1.System Cpu load(%) \tmax=$cpuusagemax,average=$cpuusageavg,mim=$cpuusagemin” |tee -a $REPORTFILE/usr/local/bin/gnuplot --persist <$GNUPLOTFOLDER/idle_sum.$$ for (( i=0;i<=$corenu;i++ )) do cat $file |grep -v -i -E “average|system|all|linux”|sed “/^$/d”|awk “(\$2==$i){print}”|awk ‘{print $1 ,“ ”,100-$8}‘>$GNUPLOTFOLDER/$i.txt local idlesum=`awk ‘BEGIN{total=0}{total+=$2}END{print total}‘ $GNUPLOTFOLDER/$i.txt` echo $i $idlesum >>$GNUPLOTFOLDER/idle_sum.$$ done first_load=`cat $GNUPLOTFOLDER/idle_sum.$$|sort -n -k 2 -r|sed -n 1p|awk ‘{print $1}‘` second_load=`cat $GNUPLOTFOLDER/idle_sum.$$|sort -n -k 2 -r|sed -n 2p|awk ‘{print $1}‘` third_load=`cat $GNUPLOTFOLDER/idle_sum.$$|sort -n -k 2 -r|sed -n 3p|awk ‘{print $1}‘` load=($first_load $second_load $third_load) echo -e “\t2.Each core load:” local cpuload=(“First” “Second” “Third”) local nu=0 for i in ${load[@]} do local coreloadmax=`cat $GNUPLOTFOLDER/$i.txt|sort -n -k 2 -r|sed -n 1p|awk ‘{print $2}‘` local coreloadavg=`awk ‘BEGIN{total=0}{total+=$2}END{print total/NR}‘ $GNUPLOTFOLDER/$i.txt` local coreloadmin=`cat $GNUPLOTFOLDER/$i.txt|sort -n -k 2|sed -n 1p|awk ‘{print $2}‘` echo -e “\t\t\t Load ${cpuload[$nu]} core $i : max=$coreloadmax , avg=$coreloadavg , min=$coreloadmin”|tee -a $REPORTFILE nu=`echo $nu+1|bc` done for ((i=0;i<=corenu;i++)) do if [ $i -eq $first_load ];thenLW=4 elif [ $i -eq $second_load ];thenLW=3 elif [ $i -eq $third_load ];thenLW=2 elseLW=1 fi TMP1=“$GNUPLOTFOLDER/$i.txt” TMP2=“using 1:2 with l lw $LW” TMP3=“core $i ” PLOT=“$PLOT \”$TMP1\“ $TMP2 title \”$TMP3\“,” done local tmp_ylabel_range=`cat $file|grep -v -i -E “average|system|all|linux”|sed “/^$/d”|awk ‘{print 100-$8}‘|sort -n -r|sed -n 1p|awk -F “.” ‘{print $1}‘|sed -n 1p` local ylabel_range=`echo $tmp_ylabel_range+5|bc`/usr/local/bin/gnuplot --persist <$GNUPLOTFOLDER/memory.$$ SOURCE_FILE=$GNUPLOTFOLDER/memory.$$ local memtotal=`awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}‘ $SOURCE_FILE` local memusedmax=`awk ‘{print $4}‘ $SOURCE_FILE|sort -n -r|sed -n 1p` local memusedavg=`awk ‘BEGIN{total=0}{total+=$4}END{print total/NR}‘ $SOURCE_FILE` local memusedmin=`awk ‘{print $4}‘ $SOURCE_FILE|sort -n|sed -n 1p` local memfreemax=`awk ‘{print $2}‘ $SOURCE_FILE|sort -n -r|sed -n 1p` local memfreeavg=`awk ‘BEGIN{total=0}{total+=$2}END{print total/NR}‘ $SOURCE_FILE` local memfreemin=`awk ‘{print $2}‘ $SOURCE_FILE|sort -n|sed -n 1p` local memcachemax=`awk ‘{print $7}‘ $SOURCE_FILE|sort -n -r|sed -n 1p` local memcacheavg=`awk ‘BEGIN{total=0}{total+=$7}END{print total/NR}‘ $SOURCE_FILE` local memcachemin=`awk ‘{print $7}‘ $SOURCE_FILE|sort -n|sed -n 1p` local memused_cachemax=`awk ‘{print $4-$7}‘ $SOURCE_FILE|sort -n -r|sed -n 1p` local memused_cacheavg=`awk ‘BEGIN{total=0}{total+=($4-$7)}END{print total/NR}‘ $SOURCE_FILE` local memused_cachemin=`awk ‘{print $4-$7}‘ $SOURCE_FILE|sort -n|sed -n 1p` local used_percent=`awk ‘BEGIN{total=0}{total+=$5}END{print total/NR}‘ $SOURCE_FILE` echo “`date ‘+%F %H:%M:%S‘`: Memory usage analysis” |tee -a $REPORTFILE echo -e “\t\t1.total memory: $memtotal MB”|tee -a $REPORTFILE echo -e “\t\t2.memory used: max=$memusedmax MB ,avg=$memusedavg MB ,min=$memusedmin MB”|tee -a $REPORTFILE echo -e “\t\t3.memory free: max=$memfreemax MB ,avg=$memfreeavg MB ,min=$memfreemin MB”|tee -a $REPORTFILE echo -e “\t\t4.memory cache: max=$memcachemax MB ,avg=$memcacheavg MB ,min=$memcachemin MB”|tee -a $REPORTFILE echo -e “\t\t4.memory used-cache: max=$memused_cachemax MB ,avg=$memused_cacheavg MB ,min=$memused_cachemin MB”|tee -a $REPORTFILE/usr/local/bin/gnuplot --persist <$GNUPLOTFOLDER/disk.$$ local SOURCE_FILE=$GNUPLOTFOLDER/disk.$$ plot_readiops=“” plot_writeiops=“” local nu=1 echo “`date ‘+%F %H:%M:%S‘`: Disk Performance analysis” |tee -a $REPORTFILE for diskpart in `cat $file |sed ‘1,2d‘|grep -v -i “device”|awk -F “ ” ‘{print $1}‘|sort|uniq -d|sed ‘/^$/d‘|grep -E “^[a-z][a-z][a-z]$”` do awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE >$GNUPLOTFOLDER/gnu_tmpfile.$diskpart plot_readiops=“$plot_readiops \”$GNUPLOTFOLDER/gnu_tmpfile.$diskpart\“ using 4 w l title \”$diskpart read IOPS\“,” awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘BEGIN{total=0}{total+=$4}END{print total/NR}‘>$GNUPLOTFOLDER/t.$$ local read_avg_iops=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $4}‘|sort -n|sed -n 1p>$GNUPLOTFOLDER/t.$$ local read_min_iops=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $4}‘|sort -n -r |sed -n 1p>$GNUPLOTFOLDER/t.$$ local read_max_iops=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ plot_writeiops=“$plot_writeiops \”$GNUPLOTFOLDER/gnu_tmpfile.$diskpart\“ using 5 w l title \”$diskpart write IOPS\“,” awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘BEGIN{total=0}{total+=$5}END{print total/NR}‘>$GNUPLOTFOLDER/t.$$ local write_avg_iops=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $5}‘|sort -n|sed -n 1p>$GNUPLOTFOLDER/t.$$ local write_min_iops=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $5}‘|sort -n -r |sed -n 1p>$GNUPLOTFOLDER/t.$$ local write_max_iops=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘BEGIN{total=0}{total+=$6}END{print total/NR}‘>$GNUPLOTFOLDER/t.$$ local avg_read_throughput=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $6}‘|sort -n|sed -n 1p>$GNUPLOTFOLDER/t.$$ local min_read_throughput=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $6}‘|sort -n -r |sed -n 1p>$GNUPLOTFOLDER/t.$$ local max_read_throughput=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘BEGIN{total=0}{total+=$7}END{print total/NR}‘>$GNUPLOTFOLDER/t.$$ local avg_write_throughput=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $7}‘|sort -n|sed -n 1p>$GNUPLOTFOLDER/t.$$ local min_write_throughput=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $7}‘|sort -n -r |sed -n 1p>$GNUPLOTFOLDER/t.$$ local max_write_throughput=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘BEGIN{total=0}{total+=$10}END{print total/NR}‘>$GNUPLOTFOLDER/t.$$ local avg_await=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $10}‘|sort -n|sed -n 1p>$GNUPLOTFOLDER/t.$$ local min_await=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ awk “(\$1==\”$diskpart\“){print}” $SOURCE_FILE|awk ‘{print $10}‘|sort -n -r |sed -n 1p>$GNUPLOTFOLDER/t.$$ local max_await=`cat $GNUPLOTFOLDER/t.$$` rm -f $GNUPLOTFOLDER/t.$$ echo -e “\t\t$nu.$diskpart performance:”|tee -a $REPORTFILE echo -e “\t\t\t read iops:\t\t max=$read_max_iops ,\t avg=$read_avg_iops ,\t min=$read_min_iops”|tee -a $REPORTFILE echo -e “\t\t\t write iops:\t\t max=$write_max_iops ,\t avg=$write_avg_iops ,\t min=$write_min_iops”|tee -a $REPORTFILE echo -e “\t\t\t read data per second:\t max=$max_read_throughput KB,\t avg=$avg_read_throughput KB,\t min=$min_read_throughput KB”|tee -a $REPORTFILE echo -e “\t\t\t write data per second:\t max=$max_write_throughput KB,\t avg=$avg_write_throughput KB,\t min=$min_write_throughput KB”|tee -a $REPORTFILE echo -e “\t\t\t each io wait time:\t max=$max_await ms ,\t avg=$avg_await ms ,\t min=$min_await ms”|tee -a $REPORTFILE done /usr/local/bin/gnuplot --persist <$GNUPLOTFOLDER/network_sourcefile.txt local sourcefile=$GNUPLOTFOLDER/network_sourcefile.txt local titlerxpackage=`cat $file |grep -i “IFACE”|awk ‘{print $3}‘|uniq -d` local titletxpackage=`cat $file |grep -i “IFACE”|awk ‘{print $4}‘|uniq -d` local titlerxbyte=`cat $file |grep -i “IFACE”|awk ‘{print $5}‘|uniq -d` local titletxbyte=`cat $file |grep -i “IFACE”|awk ‘{print $6}‘|uniq -d` if [ $titlerxbyte == ‘rxkB/s‘ ];thenunit=“KB” elif [ $titlerxbyte == ‘rxbyt/s‘ ];thenunit=“byte” fi local rxpackage=‘‘ local txpackage=‘‘ local rxbyte=‘‘ local txbyte=‘‘ local nu=1 echo “`date ‘+%F %H:%M:%S‘`: Network Performance analysis” |tee -a $REPORTFILE for netcard in `cat $file |grep -E “eth|em”|grep -v -i “average”|awk ‘{print $2}‘|sort|uniq -d` docat $sourcefile|grep $netcard>$GNUPLOTFOLDER/gnu_network.$netcardrxpackage=“$rxpackage \”$GNUPLOTFOLDER/gnu_network.$netcard\“ using 1:3 w l title \”$netcard $titlerxpackage\“,”txpackage=“$txpackage \”$GNUPLOTFOLDER/gnu_network.$netcard\“ using 1:4 w l title \”$netcard $titletxpackage\“,”rxbyte=“$rxbyte \”$GNUPLOTFOLDER/gnu_network.$netcard\“ using 1:5 w l title \”$netcard $titlerxbyte\“,”txbyte=“$txbyte \”$GNUPLOTFOLDER/gnu_network.$netcard\“ using 1:6 w l title \”$netcard $titletxbyte\“,”max_rxpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 3|sed -n 1p|awk ‘{print $4}‘` avg_rxpck=`awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}‘ $GNUPLOTFOLDER/gnu_network.$netcard`min_rxpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 3|sed -n 1p|awk ‘{print $4}‘` max_txpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 4|sed -n 1p|awk ‘{print $5}‘` avg_txpck=`awk ‘BEGIN{total=0}{total+=$4}END{print total/NR}‘ $GNUPLOTFOLDER/gnu_network.$netcard`min_txpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 4|sed -n 1p|awk ‘{print $5}‘` max_rxbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 5|sed -n 1p|awk ‘{print $6}‘` avg_rxbyt=`awk ‘BEGIN{total=0}{total+=$5}END{print total/NR}‘ $GNUPLOTFOLDER/gnu_network.$netcard`min_rxbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 5|sed -n 1p|awk ‘{print $6}‘` max_txbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 6|sed -n 1p|awk ‘{print $7}‘` avg_txbyt=`awk ‘BEGIN{total=0}{total+=$6}END{print total/NR}‘ $GNUPLOTFOLDER/gnu_network.$netcard`min_txbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 6|sed -n 1p|awk ‘{print $7}‘` echo -e “\t\t$nu.$netcard load:”|tee -a $REPORTFILEecho -e “\t\t\t rxpck/s:\t\t max=$max_rxpck ,\t avg=$avg_rxpck ,\t min=$min_rxpck”|tee -a $REPORTFILEecho -e “\t\t\t txpck/s:\t\t max=$max_txpck ,\t avg=$avg_txpck ,\t min=$min_txpck”|tee -a $REPORTFILEecho -e “\t\t\t rxbyt/s:\t max=$max_rxbyt $unit,\t avg=$avg_rxbyt $unit,\t min=$min_rxbyt $unit”|tee -a $REPORTFILEecho -e “\t\t\t txbyt/s:\t max=$max_txbyt $unit,\t avg=$avg_txbyt $unit,\t min=$min_txbyt $unit”|tee -a $REPORTFILEnu=`echo $nu+1|bc` done/usr/local/bin/gnuplot --persist <$REPORTFILESysInfo $SYSINFO_FILEecho “” >>$REPORTFILECpuAllUsage $CPU_USAGE_FILECpuEachCoreUsage $CPU_USAGE_FILEecho “” >>$REPORTFILEMemoryUsage $MEMORY_USAGE_FILEecho “” >>$REPORTFILEDiskUsage $DISK_USAGE_FILEecho “” >>$REPORTFILENetworkPerformance $NETWORK_USAGE_FILEecho “” >>$REPORTFILE#脚本执行完成之后,会在性能数据所在的目录中生成#report.txt 性能报告文本#TotalCpuUsage.png CPU利用率图表#CpuCoreIdle.png 每个CPU核心的Idle#MemoryUsage.png 内存使用率#DiskIOPSPerformance.png 磁盘IOPS性能#NetworkPackagePerformance.png 网卡发包率性能#NetworkThougtputPerformance.png 网卡吞吐性能#################################################

如何用 Shell 脚本编写递归程序Unix系统

编写shell脚本将VPS上的数据备份到Dropbox网盘的方法(通用2篇)

欢迎下载DOC格式的编写shell脚本将VPS上的数据备份到Dropbox网盘的方法,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式

相关文章

热门推荐

HOT

猜你喜欢

NEW
点击下载本文文档