Автор: Yakult Редактор: Джек Тиан
Источник: Публичный аккаунт «Путешествие Цзе Гэ в ИТ».
ID: Джейк_Интернет
Пожалуйста, свяжитесь с авторизацией для перепечатки (идентификатор WeChat: Hc220088) Оригинальная ссылка:7 очень полезных примеров сценариев оболочки!
Позавчера я видел, как читатель в группе поделился несколькими темами с примерами сценариев оболочки. Я только что увидел это. Почему бы мне не написать и закрепить базовые знания следующим образом:
1,Получите имена хостов с нескольких машин одновременно, запишите время, необходимое для возврата информации, перенаправьте ее в файл hostname.txt и выведите информацию о ЦП машины с кратчайшим временем после завершения всех операций.
`#!bin/bash`
`# 所以主机,以空格分隔`
`ALL_HOSTS=(IP 地址 IP 地址)`
`for host in ${ALL_HOSTS[*]}`
`do`
`{`
`start_time=$(date +'%s')`
`ssh $host "hostname" &>/dev/null`
`sleep 2`
`stop_time=$(date +'%s')`
`time_consuming=$((stop_time-start_time))`
`echo "$host: $time_consuming" >>hostname.txt`
`}&`
`done`
`wait`
`host=$(sort -n -k 2 hostname.txt | head -1 | awk -F':' '{print $1}')`
`ssh $host "top -b -n 1"`
2,Подсчитайте количество процессов Linux в категории /proc и выведите общее количество процессов, количество запущенных процессов, количество остановленных процессов, количество спящих процессов и количество процессов-зомби.
Распечатайте все процессы-зомби в файле zombie.txt, чтобы убить все процессы-зомби.
`#!/bin/bash`
`ALL_PROCESS=$(ls /proc/ | egrep '[0-9]+')`
`running_count=0`
`stoped_count=0`
`sleeping_count=0`
`zombie_count=0`
`for pid in ${ALL_PROCESS[*]}`
`do`
`test -f /proc/$pid/status && state=$(egrep "State" /proc/$pid/status | awk '{print $2}')`
`case "$state" in`
`R)`
`running_count=$((running_count+1))`
`;;`
`T)`
`stoped_count=$((stoped_count+1))`
`;;`
`S)`
`sleeping_count=$((sleeping_count+1))`
`;;`
`Z)`
`zombie_count=$((zombie_count+1))`
`echo "$pid" >>zombie.txt`
`kill -9 "$pid"`
`;;`
`esac`
`done`
`echo -e "total: $((running_count+stoped_count+sleeping_count+zombie_count))\nrunning: $running_count\nstoped: $stoped_count\nsleeping: $sleeping_count\nzombie: $zombie_count"`
3.Измените суффикс всех файлов с суффиксом «.sh» в текущем каталоге (включая подкаталоги) на «.shell», затем удалите вторую строку каждого файла.
`#!/bin/bash`
`ALL_SH_FILE=$(find . -type f -name "*.sh")`
`for file in ${ALL_SH_FILE[*]}`
`do`
`filename=$(echo $file | awk -F'.sh' '{print $1}')`
`new_filename="${filename}.shell"`
`mv "$file" "$new_filename"`
`sed -i '2d' "$new_filename"`
`done`
4.Определите, существует ли каталог /tmp/jstack, создайте новый каталог, если он не существует, и удалите все содержимое каталога, если он существует.
Распечатывайте информацию о jstack сервера-начальника каждый час и называйте файл jstack_${текущее время}. Всякий раз, когда в каталоге более 10 файлов, удаляйте самый старый файл.
`#!/bin/bash`
`DIRPATH='/tmp/jstack'`
`CURRENT_TIME=$(date +'%F'-'%H:%M:%S')`
`if [ ! -d "$DIRPATH" ];then`
`mkdir "$DIRPATH"`
`else`
`rm -rf "$DIRPATH"/*`
`fi`
`cd "$DIRPATH"`
`while true`
`do`
`sleep 3600`
`# 这里需要将inceptor改后自己的java进程名称`
`pid=$(ps -ef | grep 'inceptor' | grep -v grep | awk '{print $2}')`
`jstack $pid >> "jstack_${CURRENT_TIME}"`
`dir_count=$(ls | wc -l)`
`if [ "$dir_count" -gt 10 ];then`
`rm -f $(ls -tr | head -1)`
`fi`
`done`
5.Перехватите все информационные журналы сборщика мусора за день из test.log и подсчитайте среднее и самое продолжительное время сборщика мусора.
`#!/bin/bash`
`awk '{print $2}' hive-server2.log | tr -d ':' | awk '{sum+=$1} END {print "avg: ", sum/NR}' >>capture_hive_log.log`
`awk '{print $2}' hive-server2.log | tr -d ':' | awk '{max = 0} {if ($1+0 > max+0) max=$1} END {print "Max: ", max}'>>capture_hive_log.log`
6.Найдите 20 первых IP-адресов с наибольшим количеством запросов на порту 80 и определите, превышает ли наименьшее количество запросов в середине 500. Если оно больше 500, выведите отчет об активности системы в файл alert.txt. нет, повторите попытку через 600 с, пока не будет вывода.
`#!/bin/bash`
`state="true"`
`while $state`
`do`
`SMALL_REQUESTS=$(netstat -ant | awk -F'[ :]+' '/:22/{count[$4]++} END {for(ip in count) print count[ip]}' | sort -n | head -20 | head -1)`
`if [ "$SMALL_REQUESTS" -gt 500 ];then`
`sar -A > alert.txt`
`state="false"`
`else`
`sleep 6`
`continue`
`fi`
`done`
7.Переместите файлы размером более 10 КБ из текущего каталога в каталог /tmp, а затем выведите имена файлов в порядке убывания размера файла.
`#!/bin/bash`
`# 目标目录`
`DIRPATH='/tmp'`
`# 查看目录`
`FILEPATH='.'`
`find "$FILEPATH" -size +10k -type f | xargs -i mv {} "$DIRPATH"`
`ls -lS "$DIRPATH" | awk '{if(NR>1) print $NF}'`
Выше приведены 7 практических сценариев оболочки, которыми сегодня поделились.
Я надеюсь, что каждый сможет применить то, что он узнал из этих случаев, и применить их в сочетании со своими собственными реальными сценариями, чтобы повысить эффективность своей работы.
Оригинал не прост, кодирование не просто. Если вы считаете, что эта статья полезна для вас, пожалуйста, поставьте лайк этой статье, оставьте сообщение или перешлите ее, потому что это будет моей мотивацией выводить больше качественных статей, спасибо!