웹사이트 검색

기본 쉘 스크립팅 및 Linux 파일 시스템 문제 해결 이해 및 학습 - 10부


Linux Foundation은 LFCS 인증(Linux Foundation Certified Sysadmin)을 시작했습니다. 이 프로그램의 목적은 어디에서나 개인이 기초부터 중급까지 인증을 받을 수 있도록 하는 것입니다. Linux 시스템에 대한 운영 지원에는 실행 중인 시스템 및 서비스 지원, 전반적인 모니터링 및 분석, 상위 지원 팀에 문제를 제기할 때 현명한 의사 결정이 포함됩니다.

Linux Foundation 인증 프로그램에 대한 소개를 안내하는 다음 비디오를 확인하세요.

이것은 현재 10개의 튜토리얼로 구성된 긴 시리즈의 마지막 기사(10부)입니다. 이 기사에서는 기본 쉘 스크립팅 및 Linux 파일 시스템 문제 해결에 중점을 둘 것입니다. LFCS 인증 시험에는 두 가지 주제가 모두 필요합니다.

터미널 및 셸 이해

먼저 몇 가지 개념을 명확히 해보겠습니다.

  1. 쉘은 명령을 받아 운영 체제에 전달하여 실행되도록 하는 프로그램입니다.
  2. 터미널은 최종 사용자가 셸과 상호 작용할 수 있도록 해주는 프로그램입니다. 터미널의 한 가지 예는 아래 이미지에 표시된 대로 GNOME 터미널입니다.

셸을 처음 시작하면 명령 프롬프트(명령줄이라고도 함)가 표시되는데, 이는 셸이 일반적으로 키보드인 표준 입력 장치에서 명령을 받아들일 준비가 되었음을 알려줍니다.

몇 가지 유용한 명령을 검토하려면 이 시리즈의 다른 문서(명령을 사용하여 파일 생성, 편집 및 조작 – 1부)를 참조할 수 있습니다.

Linux는 다양한 쉘 옵션을 제공하며, 가장 일반적인 옵션은 다음과 같습니다.

배시 쉘

BashBourne Again SHell을 의미하며 GNU 프로젝트의 기본 셸입니다. Korn 셸(ksh) 및 C 셸(csh)의 유용한 기능을 통합하여 동시에 여러 가지 개선 사항을 제공합니다. 이는 LFCS 인증에서 다루는 배포판에서 사용되는 기본 셸이며, 이 자습서에서 사용할 셸입니다.

sh 쉘

Bourne SHell은 가장 오래된 쉘이므로 수년 동안 많은 UNIX 유사 운영 체제의 기본 쉘이었습니다.

ksh 쉘

Korn SHell은 1980년대 초 Bell Labs의 David Korn이 개발한 Unix 쉘입니다. Bourne 쉘과 역호환되며 C 쉘의 많은 기능을 포함합니다.

쉘 스크립트는 쉘에 의해 실행되는 명령을 차례로 결합하는 실행 프로그램으로 변환된 텍스트 파일에 불과합니다.

기본 쉘 스크립팅

앞서 언급했듯이 쉘 스크립트는 일반 텍스트 파일로 생성됩니다. 따라서 선호하는 텍스트 편집기를 사용하여 생성하고 편집할 수 있습니다. 편의를 위해 구문 강조 기능을 제공하는 vi/m(vi 편집기 사용법 - 이 시리즈의 2부 참조)을 사용하는 것이 좋습니다.

다음 명령을 입력하여 myscript.sh라는 파일을 만들고 Enter를 누릅니다.

vim myscript.sh

쉘 스크립트의 첫 번째 줄은 다음과 같아야 합니다(shebang이라고도 함).

#!/bin/bash

이는 뒤에 오는 텍스트를 실행하는 데 사용해야 하는 인터프리터의 이름을 운영 체제에 "알려줍니다".

이제 명령을 추가할 차례입니다. 주석을 추가하면 각 명령이나 전체 스크립트의 목적을 명확히 할 수 있습니다. 쉘은 파운드 기호 #(설명 주석)로 시작하는 행을 무시합니다.

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

스크립트를 작성하고 저장한 후에는 이를 실행 가능하게 만들어야 합니다.

chmod 755 myscript.sh

스크립트를 실행하기 전에 ` PATH 환경 변수에 대해 몇 마디 말해야 합니다. 우리가 달리면,

echo $PATH

명령줄에서 실행 프로그램의 이름을 입력할 때 검색되는 콜론으로 구분된 디렉터리 목록인 ` PATH:의 내용을 볼 수 있습니다. 이는 셸 환경(셸이 처음 시작될 때 셸 및 해당 하위 프로세스에 사용할 수 있는 정보 집합)의 일부이기 때문에 환경 변수라고 합니다.

명령을 입력하고 Enter 키를 누르면 셸은 ` PATH 변수에 나열된 모든 디렉터리를 검색하고 발견된 첫 번째 인스턴스를 실행합니다. 예를 들어 보겠습니다.

/usr/local/bin에 하나, /usr/bin에 하나의 동일한 이름을 가진 두 개의 실행 파일이 있는 경우 첫 번째 디렉터리에 있는 실행 파일이 실행됩니다. 먼저 다른 하나는 무시됩니다.

` PATH 변수에 나열된 디렉터리 중 하나에 스크립트를 저장하지 않은 경우 실행하려면 파일 이름에 ./를 추가해야 합니다. 그것. 그렇지 않으면 일반 명령을 사용하는 것처럼 실행할 수 있습니다.

pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh

조건부

명령의 성공 또는 실패의 결과로 쉘 스크립트에서 수행할 다양한 조치 과정을 지정해야 할 때마다 if 구문을 사용하여 해당 조건을 정의합니다. 기본 구문은 다음과 같습니다.

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

여기서 CONDITION은 다음 중 하나일 수 있으며(여기에는 가장 빈번한 조건만 인용됨) 다음과 같은 경우 true로 평가됩니다.

  1. [ -a 파일 ] → 파일이 존재합니다.
  2. [ -d file ] → 파일이 존재하며 디렉토리입니다.
  3. [ -f file ] →file이 존재하며 일반 파일입니다.
  4. [ -u file ] →파일이 존재하고 해당 SUID(사용자 ID 설정) 비트가 설정되었습니다.
  5. [ -g file ] →file이 존재하고 해당 SGID 비트가 설정되었습니다.
  6. [ -k file ] →file이 존재하고 고정 비트가 설정되었습니다.
  7. [ -r 파일 ] →파일이 존재하며 읽을 수 있습니다.
  8. [ -s 파일 ]→ 파일이 존재하며 비어 있지 않습니다.
  9. [ -w 파일 ]→파일이 존재하며 쓰기 가능합니다.
  10. [ -x file ]은 파일이 존재하고 실행 가능하면 true입니다.
  11. [ string1=string2 ] → 문자열이 동일합니다.
  12. [ string1 != string2 ] →문자열이 동일하지 않습니다.

[ int1 op int2 ]는 이전 목록의 일부여야 하며, 다음 항목(예: int1-eq –>)은 true입니다. >는 int2와 같습니다.)는 [ int1 op int2 ]의 "하위" 목록이어야 합니다. 여기서 op 다음 비교 연산자 중 하나입니다.

  1. -eq –>는 int1이 int2와 같으면 true입니다.
  2. -ne –> int1이 int2와 같지 않으면 true입니다.
  3. -lt –> int1이 int2보다 작으면 true입니다.
  4. -le –> int1이 int2보다 작거나 같으면 true입니다.
  5. -gt –> int1이 int2보다 크면 true입니다.
  6. -ge –> int1이 int2보다 크거나 같으면 true입니다.

For 루프

이 루프를 사용하면 값 목록의 각 값에 대해 하나 이상의 명령을 실행할 수 있습니다. 기본 구문은 다음과 같습니다.

for item in SEQUENCE; do 
		COMMANDS; 
done

여기서 item은 각 반복 동안 SEQUENCE의 각 값을 나타내는 일반 변수입니다.

while 루프

이 루프를 사용하면 제어 명령이 종료 상태가 0인 상태에서(성공적으로) 실행되는 한 일련의 반복 명령을 실행할 수 있습니다. 기본 구문은 다음과 같습니다.

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

여기서 EVALUATION_COMMAND는 성공(0) 또는 실패(0 제외) 상태로 종료할 수 있는 명령일 수 있으며 EXECUTE_COMMANDS 다른 중첩 루프를 포함하여 모든 프로그램, 스크립트 또는 셸 구성이 될 수 있습니다.

함께 모아서

다음 예제를 통해 if 구문과 for 루프의 사용법을 보여드리겠습니다.

시스템 기반 배포판에서 서비스가 실행 중인지 확인

한눈에 모니터링하고 싶은 서비스 목록을 파일로 만들어 보겠습니다.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

쉘 스크립트는 다음과 같아야 합니다.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

스크립트가 어떻게 작동하는지 설명하겠습니다.

1). for 루프는 myservices.txt 파일을 한 번에 LIST의 한 요소씩 읽습니다. 해당 단일 요소는 service라는 일반 변수로 표시됩니다. LIST는 다음의 출력으로 채워집니다.

cat myservices.txt

2). 위 명령은 괄호로 묶이고 앞에 달러 기호가 표시되어 반복할 LIST를 채우기 위해 평가해야 함을 나타냅니다.

3). LIST의 각 요소(서비스 변수의 모든 인스턴스를 의미)에 대해 다음 명령이 실행됩니다.

systemctl status $service | grep --quiet "running"

이번에는 일반 변수(LIST의 각 요소를 나타냄) 앞에 달러 기호를 붙여 해당 변수가 변수임을 나타내므로 각 반복에서 해당 값을 사용해야 합니다. 그런 다음 출력이 grep으로 파이프됩니다.

–quiet 플래그는 grep이 running이라는 단어가 나타나는 줄을 화면에 표시하는 것을 방지하는 데 사용됩니다. 그런 일이 발생하면 위 명령은 종료 상태 0(if 구성에서 $?로 표시됨)을 반환하여 서비스가 실행 중인지 확인합니다.

0이 아닌 종료 상태(systemctl status $service의 출력에서 실행 중인 단어를 찾을 수 없음을 의미)는 서비스가 존재하지 않음을 나타냅니다. 달리기.

한 단계 더 나아가 for 루프를 시작하기 전에 myservices.txt가 있는지 확인할 수 있습니다.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi
응답 통계를 위해 일련의 네트워크 또는 인터넷 호스트를 핑합니다.

텍스트 파일에 호스트 목록을 유지하고 스크립트를 사용하여 때때로 ping이 가능한지 여부를 확인할 수 있습니다(myhosts의 내용을 자유롭게 바꾸고 직접 시도해 보세요). ).

읽기 셸 내장 명령은 while 루프에 myhosts를 한 줄씩 읽도록 지시하고 각 줄의 내용을 변수 호스트에 할당한 다음 ping 명령으로 전달합니다.

#!/bin/bash

This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

또한 읽어보세요:

  1. 쉘 스크립팅 배우기: 초보자부터 시스템 관리자까지의 가이드
  2. 쉘 프로그래밍을 배우기 위한 5가지 쉘 스크립트

파일 시스템 문제 해결

Linux는 매우 안정적인 운영 체제이지만 어떤 이유로(예: 정전으로 인해) 충돌이 발생하는 경우 파일 시스템 중 하나(또는 그 이상)가 제대로 마운트 해제되지 않으므로 Linux를 실행할 때 자동으로 오류가 확인됩니다. 다시 시작됩니다.

또한 일반 부팅 중에 시스템이 부팅될 때마다 파일 시스템을 마운트하기 전에 항상 파일 시스템의 무결성을 확인합니다. 두 경우 모두 fsck(“파일 시스템 검사 ”)라는 도구를 사용하여 이 작업을 수행합니다.

fsck는 파일 시스템의 무결성을 검사할 뿐만 아니라 지시가 있는 경우 손상된 파일 시스템을 복구하려고 시도합니다. 손상의 심각도에 따라 fsck가 성공할 수도 있고 실패할 수도 있습니다. 이 경우 복구된 파일 부분은 각 파일 시스템의 루트에 있는 lost+found 디렉터리에 저장됩니다.

마지막으로, 운영 체제가 아직 USB 드라이브에 쓰고 있는 동안 USB 드라이브를 제거하려고 하면 불일치가 발생할 수 있으며 심지어 하드웨어가 손상될 수도 있다는 점에 유의해야 합니다.

fsck의 기본 구문은 다음과 같습니다.

fsck [options] filesystem
파일 시스템에 오류가 있는지 확인하고 자동으로 복구를 시도합니다.

fsck로 파일 시스템을 확인하려면 먼저 마운트를 해제해야 합니다.

mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1

-y 플래그 외에도 -a 옵션을 사용하여 질문 없이 파일 시스템을 자동으로 복구하고 파일 시스템이 깨끗해 보이는 경우에도 강제로 검사를 수행할 수 있습니다.

fsck -af /dev/sdg1

(당분간 아무 것도 고치려고 하지 않고) 무엇이 잘못되었는지 알아내는 데만 관심이 있다면 -n 옵션을 사용하여 fsck를 실행할 수 있습니다. 그러면 파일 시스템 문제가 표준 출력으로 출력됩니다.

fsck -n /dev/sdg1

fsck 출력의 오류 메시지에 따라 문제를 직접 해결할 수 있는지 아니면 엔지니어링 팀에 에스컬레이션하여 하드웨어에 대한 추가 검사를 수행할 수 있는지 알 수 있습니다.

요약

LFCS 시험에 합격하는 데 필요한 기본 도메인 역량을 다루려고 노력한 이 10개 기사 시리즈를 마쳤습니다.

분명한 이유로 단일 튜토리얼에서 이러한 주제의 모든 측면을 다루는 것은 불가능합니다. 따라서 이 기사를 통해 여러분이 새로운 것을 직접 시도하고 계속 학습할 수 있는 올바른 방향으로 나아갈 수 있기를 바랍니다.

질문이나 의견이 있으시면 언제든지 환영합니다. 주저하지 말고 아래 양식을 통해 연락주세요!