日常工作中經常涉及linux環境下的進程以及Docker容器相關的操作,現有幾例常用的shell腳本,以供大家學習交流。
1進程的啟動、關閉、重啟
應用程序中有master、worker兩種角色的進程,在系統維護中,一般編寫腳本快速進行進程的啟動、關閉和重啟操作。
1.1 進程啟動
進程啟動腳本 start.sh文件:
#! /bin/bash
proc=$1
if [ -z $proc ]; then
echo "請輸入待啟動的進程標識【master / worker】"
exit
elif [ "master" == $proc ]; then
echo "start master"
elif [ "worker" == $proc ]; then
echo "start worker"
else
echo "進程標識僅限【master / worker】"
exit
fi
master="master-*.jar"
worker="worker-*.jar"
date=`date +%Y-%m-%d`
JAVA="/data/jdk1.8.0_171/bin/java"
if [ "master" == $proc ]; then
logfile="master."$date".log"
nohup $java -jar $master >> $logfile &
else
logfile="worker."$date".log"
nohup $java -jar $worker >> $logfile &
fi
說明:
該段shell腳本首先判斷是否輸入master或worker標志,然后根據輸入的進程標志啟動相應的java進程。
1.2 進程啟動
進程關閉腳本 stop.sh文件:
#! /bin/bash
proc=$1
if [ -z $proc ]; then
echo "請輸入待關閉進程的標識【master / worker】"
exit
elif [ "master" == $proc ]; then
echo "stop master"
elif [ "worker" == $proc ]; then
echo "stop worker"
else
echo "進程標識僅限【master / worker】"
exit
fi
master="master-"
worker="worker-"
if [ "master" == $proc ]; then
ps -ef | grep $master | grep -v grep | gawk '{print($2)}' | xargs kill -9
else
ps -ef | grep $worker | grep -v grep | gawk '{print($2)}' | xargs kill -9
fi
說明:
進程的關閉命令中grep -v grep是排除grep那條輸出,gawk '{print($2)}'輸出進程id。
1.3 進程重啟
進程重啟腳本 restart.sh文件:
#! /bin/bash
proc=$1
if [ -z $proc ]; then
echo "請輸入待重啟進程標識【master / worker】"
exit
elif [ "master" == $proc ]; then
echo "restart master"
elif [ "worker" == $proc ]; then
echo "restart worker"
else
echo "進程標識僅限【master / worker】"
exit
fi
./stop.sh $1
./start.sh $1
說明:
進程重啟腳本是先調用進程關閉腳本,然后調用進程開啟腳本。
2Docker容器批量操作
2.1 鏡像批量保存
harbor鏡像批量保存腳本 harbor-save-images.sh文件:
docker save vmware/postgresql-photon:v1.5.1 vmware/photon:1.0 ... | gzip -c > harbor-images.tar.gz
在離線環境安裝Kubernetes系統時,可能涉及rancher、harbor的鏡像批量保存和批量載入操作。
上面鏡像批量保存腳本,會自動打包成harbor-images.tar.gz文件。
2.2 鏡像批量載入
harbor鏡像批量保存腳本 harbor-load-images.sh文件:
docker load --input harbor-images.tar.gz
鏡像批量載入到本機Docker中。
2.3 容器批量停止、刪除
例如將帶vmware的Docker容器批量停止
首先查看名稱帶有vmware的容器進程,腳本如下:
[root@test docker]# docker ps -a | grep vmware
e91e88d075e3 vmware/harbor-jobservice:v1.5.1 "/harbor/start.sh" harbor-jobservice
78c41eab50a8 vmware/Nginx-photon:v1.5.1 "nginx -g 'daemon off" nginx
6baa80c00bed vmware/harbor-ui:v1.5.1 "/harbor/start.sh" harbor-ui
38ccca88abe6 vmware/registry-photon:v2.6.2-v1.5.1 "/entrypoint.sh serve" registry
4f834a7b331a vmware/harbor-adminserver:v1.5.1 "/harbor/start.sh" harbor-adminserver
405c83e6b593 vmware/redis-photon:v1.5.1 "docker-entrypoint.sh" redis
733af6727a6e vmware/harbor-db:v1.5.1 "/usr/local/bin/docke" harbor-db
42da8dc53c90 vmware/harbor-log:v1.5.1 "/bin/sh -c /usr/loca" harbor-log
批量停止容器腳本如下:
[root@test docker]# docker ps -a | grep vmware | gawk '{print($1)}' | xargs docker stop
e91e88d075e3
78c41eab50a8
6baa80c00bed
38ccca88abe6
4f834a7b331a
405c83e6b593
733af6727a6e
42da8dc53c90
批量刪除容器腳本如下:
docker ps -a | grep vmware | gawk '{print($1)}' | xargs docker rm
說明:
腳本中gawk '{print($1)}'輸出Docker容器的id。