1. 문제 상황

CentOS 7에서 방화벽 관련 포트나 서비스를 열거나 닫을 때, firewalld 명령어를 사용한다.

최소 설치를 했을 때에는 자동으로 설치되지 않기 때문에 firewalld 명령어를 사용했을 때,

firewall-cmd: command not found라는 에러가 발생한다. 

 

 

2. 해결 방법

아래 명령으로 필요한 패키지를 설치하면 해결 완료!

yum install firewalld

 

3. 사용법

systemctl unmask firewalld
systemctl enable firewalld
systemctl start firewalld

 

 

참고 사이트

1. 문제 상황

Ubuntu, CentOS와 같은 Linux에서 netstat 명령어를 실행했을 때
bash: netstat: command not found 오류를 해결하고자 한다!

 

2. 해결 방법
ifconfig, netstat 등 네트워크 관련 명령어의 경우 net-tools 패키지를 설치해야 한다.

  • Ubuntu
apt install net-tools
  • CentOS
yum install net-tools

 

 

참고 사이트

NHN Cloud에 redis를 자동 설치하는 쉘 스크립트를 작성하면서 여러 환경설정 파일을 수정해야 하는 상황이 있었다.

 

사실 /etc/profile, bashrc를 수정하면서도 정확히 어떤 아이들인지 알지 못한 채 찜찜한 상태로.. 돌아가는데만 집중한 점을 반성하면서 (ㅠㅠ) 리눅스에 어떤 환경설정 파일들이 있는지, 어떤 역할을 하는지, 어떤 순서로 적용되는지 꼼꼼히 알아보고자 한다.

 

또한, 선임님께서 말씀해주신 시스템용과 유저별 환경설정 파일의 구분과 설정 내용을 영구적으로 적용하는 방법도 함께 살펴보자!


1. 시스템 / 사용자 설정 파일

시스템 설정 파일

  • 시스템(로그인 쉘)을 사용하는 전체 사용자의 공통 환경을 설정, 시스템 관리자가 관리
  • /etc 디렉토리에 존재
  • 많이 사용하는 bash 쉘
    • /etc/profile : 일반 설정 (모든 사용자에게 적용되는 환경변수, 시작 프로그램 등)
    • /etc/bashrc : alias 관련 함수 설정
    • /etc/profile.d/*.sh : /etc/profile 에서 /etc/profile.d 하위의 sh 파일들을 source하게 되어있음

 

사용자 설정 파일

  • 사용자별 환경을 설정할 수 있고, 각 사용자 홈 디렉토리에 숨김 파일로 저장
  • 많이 사용하는 bash 쉘
    • .bash_profile(.profile) : 개인 사용자에게 적용되는 환경변수, 시작 프로그램 등 (일반 설정 무시 가능)
    • .bashrc : alias 설정
    • .bash_logout : 로그아웃 시 지정 설정

이 중 .profile과 .bash_profile은 같은 것으로 보통 둘 중 하나만 존재하고 둘 다 있다면 .bash_profile 실행

 

 

2. 로그인 / 비로그인 쉘

리눅스에 로그인하면 bash 프로그램이 시작되어 전체 환경을 설정하는 시스템 환경설정을 하게 되고, 사용자별 홈 디렉토리에 있는 설정 파일을 읽어 환경설정을 덮을 수 있다.

 

여기서 사용자란 로그인한 상태를 말하고, 로그인과 비로그인은 로그인 쉘과 비로그인 쉘로 표현한다.

 

로그인 쉘

ID와 Password를 입력해서 쉘에 접근하는 방법

 

비로그인 쉘

GUI 상에서 바로 터미널로 접근하는 방법

 

 

3. 실행 순서

로그인 쉘과 비로그인 쉘 경로의 차이를 살펴보자!

 

로그인 쉘

  1. /etc/profile : 모든 사용자에게 적용되는 환경 설정
  2. ~/.bash_profile : /etc/profile의 설정을 확장하거나 무시
    • 사용자별 홈 디렉토리에 존재하는 환경설정 파일
    • 사용자 홈에서만 사용하는 터미널 설정과 환경변수 설정 기록
    • 로그아웃 될 때까지 유지 및 source 명령어로 설정 적용 가능
  3. ~/.bashrc : 상위 파일이 없으면 읽음
  4. ~/etc/bashrc : 상위 파일이 없으면 읽음

 

비로그인 쉘

로그인 쉘의 상위 프로세스로부터 환경 값을 물려 받는다.

  1. /etc/bashrc
  2. ~/.bashrc

 

최종적으로 터미널은 .bashrc로 실행

사용자가 정의한 변수, alias, 함수 등 사용자가 사용하는 항목 설정

로그인이든 비로그인이든 쉘 시작시 실행

 

💡 로그인 쉘과 자식 쉘을 같은 환경으로 하려면

모든 환경 설정 값은 .bashrc에 넣고 .profile(또는 .bash_profile)의 마지막에 .bashrc 파일을 source 명령으로 실행하기

 

 

4. 변경사항 영구 적용하기

# 시스템 : /etc/profile 하단에
export [변수명]=[환경변수값]

# 사용자 : .bashrc 나 .bash_profile
export [변수명]=[환경변수값]
source [파일명]

 

 

 

 

 

 

Reference

NHN Cloud 인스턴스에 MySQL을 설치하는 쉘 스크립트를 작성하면서 wget이라는 것을 알게 되었다.

리눅스에서 인터넷을 통해 파일을 받는 가장 좋은 방법은 wget 명령어를 사용하는 것이다.

 

단순히 단일 파일을 받는 정도로 사용하고 있었는데

다른 인턴분이 --spider 옵션 사용한 것을 보고 wget에 대해서 좀 더 자세히 알아볼까 한다!


✅ 공식문서

http://gnu.org/software/wget/

 

 

개념

  • wget은 webget의 줄임말
  • HTTP, HTTPS, FTP와 FTPS 등 가장 널리 사용되는 인터넷 프로토콜을 이용해 파일을 검색하기 위한 자유 소프트웨어 패키지
  • 상호작용 하지 않는 (non-interactive) 커맨드라인 툴이기 때문에 스크립트, cron 작업, X-Windows 지원이 없는 터미널에서 쉽게 호출됨

 

특징

  • REST와 RANGE를 사용해서 중단된 다운로드 재개 가능
  • 파일 이름 와일드카드를 사용하고, 디렉토리를 재귀적으로 미러링 가능
  • Windows, 대부분의 UNIX-like OS에서 사용 가능
  • HTTP 프록시, 쿠키와 영속적인 커넥션 지원
  • 미러링할 때 문서를 다시 다운로드 해야 하는지 여부 결정을 위해 로컬 파일 타임스탬프 사용

 

사용법

wget [option]… [URL]…

 

1. 다운로드 가능한지 확인하기

URL이 broken link인지 확인해주는 옵션으로 --spider를 사용하면 된다.

header 정보만 받아서 보여주는 기능이다.

wget --spider [URL]

공식문서에서는 다운로드가 가능한 페이지인지 확인하는 것이 거의 마치 real 웹 스파이더처럼 동작하는 것이라고 적혀 있다 (ㅋㅋ)

 

 

 

2. 단일 파일 받기

wget [URL]

다운로드 동안 다음의 정보를 확인할 수 있다.

  • 현재까지 다운로드 받은 퍼센트
  • 현재까지 다운로드 받은 바이트 수
  • 다운로드 속도
  • 완료까지 남은 시간

 

 

3. 다른 이름으로 저장하기

-O 옵션으로 파일을 원하는 파일이름으로 다운로드 받을 수 있다.

wget -O [파일이름] [URL]

 

 

4. 다운로드 속도 지정

기본적으로는 가능한 최대 대역폭을 사용하지만, 대량의 파일을 받을 때는 대역폭을 조절할 필요가 있다.

wget --limit-rate=[대역폭] [URL]

 

 

5. 이어받기

-c 옵션으로 다운로드 중에 중단됐을 경우 다시 시작할 수 있다.

대용량 파일을 다운로드 중에 멈추고 다른 작업을 해야했을 때 이전에 다운로드를 이어서 할 수 있어서 유용하다.

wget -c [URL]

 

 

6. 백그라운드에서 다운로드하기

-b 옵션으로 대용량 파일을 받을 때 백그라운드에서 처리할 수 있다.

wget -b [URL]

다운로드 상황은 모두 wget-log에 기록된다.

❗️tail -f wget-log로 확인 가능

 

 

7. 브라우저에서 다운로드 하는 것처럼 user-agent 정보 보내기

몇몇 사이트는 브라우저로 다운로드 하지 않으면 다운로드를 허가하지 않는 경우가 있다.

이 때 --user-agent 옵션으로 정보를 보낼 수 있다.

wget --user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" [URL]

 

 

8. 재시도 횟수 지정하기

기본 재시도 횟수는 20이다. 더 많이 시도하고 싶으면 --tries 옵션으로 횟수를 조정할 수 있다.

wget --tries=[숫자] [URL]

 

 

9. 여러개의 파일 다운로드하기

여러 파일을 한번에 다운로드 할 때 유용하다. 다운로드 하고자 하는 링크를 파일에 쓰고 (엔터로 구분), -i 옵션과 파일 위치를 적으면 된다.

wget -i [file]

 

 

10. 로그파일 남기기

wget은 에러메시지를 stderr에 출력하는데 -o 옵션으로 지정한 파일에 로그를 남길 수 있다.

wget -o [로그파일명] [URL]

 

 

 

외에도 공식문서에 정말 많은 옵션이 있으니 참고해보면 좋을 것 같다.

 

 

 

 

 

 

Reference

✅ 공식문서

https://helpdesk.dooray.com/share/pages/9wWo-xwiR66BO5LGshgVTg/2939987647631384419

 

📍 목차

  1. 과제 내용
  2. 프로세스
  3. 주요 명령어
  4. 코드
  5. 결과

 

과제 내용

  • 특정 두레이 프로젝트에 일일 스크럼 태스크를 자동 등록해주는 프로그램 작성
    • 일일 태스크 생성: [2023/01/10 (화) 일일 스크럼] 등 일일 스크럼 태스크를 1주일 전 매일 자동 생성
    • 주간 태스크 생성: 2023/01/10(화) 데이터운영팀 주간 업무 회의 의 주간 회의 태스크는 다음주 회의 태스크 자동 생성

 

프로세스

개발환경

  • macOS Monterey
  • intel 7i / x86_64

 

도식화

  • 상위 업무가 있는지 확인
    • 없으면 연 또는 월 단위의 상위 업무 생성
  • 해당 일에 업무가 있는지 확인 (수동으로 등록된 것이 있는지 확인 차원)
    • 없으면 가장 최근에 등록된 일일 업무가 있는지 확인
      • 있다면 가장 최근 일일 업무 상태-완료/만기일-미정 설정
  • 하위 업무 생성
  • 젠킨스에서 설정한 두레이 대화방에 메시지 알림

 

세부사항

  • 상위 업무에 하위 업무로 등록됨
  • 태그 : 지정한 태그명
  • 날짜 : 생성될 때 일주일 후 날짜로 자동 생성됨
  • 담당자 : 본인 (그룹으로도 가능)
  • 실행 : 젠킨스 사용
    • 일일 스크럼 : 평일 9시마다 빌드
    • 주간업무회의 : 화요일 9시마다 빌드

 

주요 명령어

curl

  • 프로토콜을 이용해 URL로 데이터를 전송해서 서버에 데이터를 보내거나 가져올 때 사용하는 명령어
  • Shell에서 REST API(http) 테스트를 하고 싶을 때 사용
  • 지원하는 프로토콜 : http / https / ftp / ldap / scp / telnet / smtp / pop3 등
  • Linux/mac OS : 기본 탑재
  • 사용한 옵션
    • -d : http POST 요청 데이터 입력
    • -s : 진행 내용이나 메시지 출력 안되게
    • -X : 요청시 사용할 메소드 종류
    • -H : 전송할 헤더 지정



date

  • 날짜 및 시간을 다양한 포맷으로 출력하고, 계산할 때 사용하는 명령어
  • macOS에서 사용하기
    • macOS는 date 명령어에 -d 옵션이 적용되지 않음
    • 포맷 : -v[-(과거)/+(미래)][일수]d
# 오늘로부터 7일 뒤 yyyy/mm/dd 형식
date -v+7d +%Y/%m/%d

# 오늘로부터 7일 뒤 요일 형식
date -v+7d +%A  # 수요일
date -v+7d +%a  # 수



jq

  • Shell에서 JSON을 조작할 수 있는 라이브러리
  • 사용한 옵션
    • -r : 결과값에 따옴표 제거해서 raw 값 받기
  • 설치
# macOS
brew install jq



crontab

  • Linux에서 일정 주기나 특정 시간에 명령을 실행하게 해주는 명령어 (스케줄러)
# crontab 작성
crontab -e

# crontab 작업 리스트 보기
crontab -l

# crontab 모든 작업 삭제
crontab -r

# 매주 일요일 23시 55분에 수행
55 23 * * 0 파일 저장된 위치 >> 로그 저장할 위치

# 매주 월-금요일 23시 55-59분에 수행
55-59 23 * * 1-5 파일 저장된 위치 >> 로그 저장할 위치

 

코드

  • 변수

 

  • 로직
  • 상위 업무 유무 확인
    • 없으면 상위 업무 생성

 

  • 하위 업무 유무 확인
    • 있으면 종료

 

  • 없으면 가장 최근 일일 업무 확인 후 상태-완료 및 만기일-미정 설정

 

  • 하위 업무 생성

 

결과

  • 성공 화면 (연 단위)
  • 성공 화면 (월 단위)

 

  • 이미 해당 일의 업무가 생성되어 있을 경우


고려한 사항

  1. 상위 업무가 연 또는 월 단위를 선택하여 생성될 수 있도록 구현
    → 연도나 월이 바뀌더라도 때마다 자동으로 상위 업무가 생성되어 수작업이 필요하지 않도록 구현
  2. 만기일(없음/미정/있음) 설정
    → 가장 최근의 업무를 업무상태를 완료로 바꿀 경우 : 만기일이 설정되어 캘린더에 나오게 됨
    → 업무를 생성하거나 변경할때 dueDateFlag: false 로 할 경우, 만기일이 없음 상태가 됨
    → 특이사항 1 : 업무상태(할일/진행중/완료) 속성을 사용할 수 없음
    → 특이사항 2 : dueDateFlag를 true로만 사용하기를 권장
  3. 크론탭만 사용했을 경우, 빌드가 실패한 경우에 재실행 등의 예외 처리가 쉽지 않음
    → 젠킨스에서 두레이와 연동된 플러그인을 사용해 빌드 실패시 재시도 횟수를 설정하여 다시 빌드되도록 설정
  4. 빌드 결과를 두레이 메시지 알림
    → 두레이 대화방 단위로 메시지 가능

 

보완이 필요한 사항

  1. 상위 업무 생성시 하위 업무가 바로 등록되지 않는 점
    → 동시성 문제인가 싶어 wait를 걸어봤는데 되지 않아서 좀 더 확인 필요
  2. 상위 업무를 생성해야 하는 경우, 태그도 함께 생성될 수 있도록 (현재는 태그가 만들어져 있다고 가정되어 있음)
    → 'application/x-www-form-urlencoded' not supported 에러 확인 필요
  3. 젠킨스봇 메시지 내용 설정이 가능한지 확인
    → 플러그인에서 지원하지 않는 것 같지만 좀 더 확인 필요

+ Recent posts