728x90
아파치 서버를 모니터링하는 간단한 파이썬 프로그램을 ChatGPT를 이용하여 작성해 보았습니다.
다음은 ChatGPT에 요청할 프로그램 내용을 작성한 것입니다.
아래와 같은 파이썬 프로그램을 작성해 주십시오. 프로그램의 목적은 아파치의 실행상황을 모니터링 하는 것입니다. 프로그램 실행 환경은 os는 리눅스, 프로그래밍 언어는 파이썬 2.7.5입니다. 프로그램 실행 방식은 cli입니다. 프로그램은 리눅스 터미널에서 실행할 것입니다. 프로그램은 사용자가 실행할 것입니다. 프로그램 사용자는 관리자가 아닌 일반 사용자입니다. 다음은 프로그램이 실행해야 할 내용입니다. 프로그램이 실행 되면 4가지 조건을 사용자에게 묻고 답변을 받습니다. 첫번째 입력 받을 값은 프로그램 실행 시간입니다. 입력 가능한 값은 0분에서 600분입니다. 0분을 입력하면 계속 실행됩니다. 기본값은 0입니다. 숫자만 입력 받습니다. 입력값은 검증이 필요합니다. 입력 범위를 벗어났을 때는 오류 메시지를 출력하고 재입력 받습니다. 두번째 입력 받을 값은 프로그램 안에서 리눅스 명령어를 재실행 하기 위한 시간 간격입니다. 입력 가능한 값은 10초에서 60초입니다. 기본값은 10초입니다. 숫자만 입력 받습니다. 입력값은 검증이 필요합니다. 입력 범위를 벗어났을 때는 오류 메시지를 출력하고 재입력 받습니다. 세번째 입력 받을 값은 파일에 결과 값을 기록할지의 여부입니다. 결과 값을 파일에 기록하고 싶으면 1, 기록하지 않으려면 0, 기본값은 1입니다. 숫자만 입력 받습니다. 입력값은 검증이 필요합니다. 입력 범위를 벗어났을 때는 오류 메시지를 출력하고 재입력 받습니다. 네번째 입력 받을 값은 결과 값을 화면에 출력할지의 여부입니다. 결과 값을 화면에 출력하고 싶으면 1, 출력하지 않으려면 0, 기본값은 1입니다. 숫자만 입력 받습니다. 입력값은 검증이 필요합니다. 입력 범위를 벗어났을 때는 오류 메시지를 출력하고 재입력 받습니다. 4가지 조건을 사용자에게 입력 받은 후에는 다음 순서로 프로그램이 실행됩니다. 1.다음에 설명할 리눅스 명령어를 차례로 실행하여 그 결과값을 받아오는 것입니다. 첫번째 리눅스 명령어 : top 두번째 리눅스 명령어 : netstat -an|grep 443|grep ESTABLISHED | wc -l 세번째 리눅스 명령어 : ps auwx | grep apache | awk '{print $6}' | awk '{total = total + $1} END {print total/1024}' 네번째 리눅스 명령어 : ps auwx | grep apache 다섯번째 리눅스 명령어 : ps auwx | grep apache |wc -l 2.리눅스 명령어의 실행은 두번째 받은 입력 값만큼 쉬었다가 또 실행합니다. 즉 다섯개의 리눅스 명령어를 다 실행하고 나서 잠시 쉬었다가 다섯개의 리눅스 명령어를 다시 실행하는 것입니다. 3.리눅스 명령어를 실행해서 받은 결과값은 세번째 입력 받은 값에 따라 파일에 기록하거나 기록하지 않습니다. 리눅스 명령어의 실행 결과를 저장할 파일의 이름은 monitoring_apache_년월일시분초.log입니다. 파일을 저장할 디렉토리의 이름은 log입니다. 디렉토리가 없다면 먼저 만들어야 합니다. 파일에 저장할 내용은 년월일시분초를 저장한 후에 개행하여 실행결과를 저장합니다. 각각의 리눅스 명령어를 실행할 때마다 그 결과를 저장합니다. 4.리눅스 명령어를 실행해서 받은 결과값은 네번째 입력 받은 값에 따라 화면에 출력하거나 출력하지 않습니다. 5.위의 1~4까지의 반복을 첫번째 받은 시간동안 실행합니다. 6.프로그램을 종료합니다. 혹시 프로그램 설명에 빠진 내용이 있다면, 제안해 주거나 보완해 주기 바랍니다. |
아래는 요구사항에 맞춰 작성한 Python 2.7.5용 프로그램입니다. 이 프로그램은 CLI에서 실행되며, 사용자가 입력한 조건에 따라 아파치 서버 관련 정보를 모니터링하고, 지정된 주기마다 결과를 출력하거나 로그 파일에 기록합니다.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import time
import datetime
import subprocess
def get_input(prompt, min_val, max_val, default):
while True:
try:
value = raw_input("{} (기본값: {}): ".format(prompt, default))
if value == "":
return default
value = int(value)
if min_val <= value <= max_val:
return value
else:
print("오류: {}에서 {} 사이의 값을 입력해 주세요.".format(min_val, max_val))
except ValueError:
print("오류: 숫자만 입력해 주세요.")
def run_command(command):
try:
output = subprocess.check_output(command, shell=True)
return output.strip()
except subprocess.CalledProcessError as e:
return "명령어 실행 실패: {}".format(e)
def log_results(file, message):
with open(file, 'a') as f:
f.write(message + '\n')
def main():
# 1. 사용자 입력 받기
exec_time = get_input("프로그램 실행 시간(0분에서 600분)", 0, 600, 0)
interval = get_input("명령어 재실행 간격(10초에서 60초)", 10, 60, 10)
log_to_file = get_input("결과를 파일에 기록할지 여부(1: 기록, 0: 기록 안함)", 0, 1, 1)
print_to_screen = get_input("결과를 화면에 출력할지 여부(1: 출력, 0: 출력 안함)", 0, 1, 1)
# 실행 종료 시각 계산 (exec_time이 0이면 무한 실행)
end_time = time.time() + (exec_time * 60) if exec_time > 0 else None
# 로그 디렉토리 생성
log_dir = "log"
if log_to_file and not os.path.exists(log_dir):
os.makedirs(log_dir)
# 로그 파일 이름 설정
log_file = os.path.join(log_dir, "monitoring_apache_{}.log".format(datetime.datetime.now().strftime('%Y%m%d%H%M%S')))
# 2. 모니터링 시작
print("모니터링 시작... 종료하려면 Ctrl+C를 누르세요.")
try:
while True:
# 3. 리눅스 명령어 실행 및 결과 수집
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
results = [timestamp]
commands = [
"top -bn1 | head -n 10",
"netstat -an | grep 443 | grep ESTABLISHED | wc -l",
"ps auwx | grep apache | awk '{print $6}' | awk '{total = total + $1} END {print total/1024}'",
"ps auwx | grep apache",
"ps auwx | grep apache | wc -l"
]
for cmd in commands:
result = run_command(cmd)
results.append(result)
# 결과 저장 및 출력
result_message = "\n".join(results)
if log_to_file:
log_results(log_file, result_message)
if print_to_screen:
print(result_message)
# 4. 실행 종료 시간 확인
if end_time and time.time() >= end_time:
print("모니터링 종료")
break
# 5. 다음 실행까지 대기
time.sleep(interval)
except KeyboardInterrupt:
print("\n프로그램이 사용자에 의해 종료되었습니다.")
if __name__ == "__main__":
main()
설명
- 사용자 입력: get_input 함수를 통해 각 입력값을 받습니다. 입력이 유효하지 않으면 오류 메시지를 출력하고 재입력받습니다.
- 명령어 실행: run_command 함수를 사용해 명령어를 실행하고, 결과값을 문자열로 반환받습니다.
- 로그 파일 기록: 결과를 파일에 기록하고 싶을 때, 해당 로그 파일을 생성해 타임스탬프와 명령어 결과를 저장합니다.
- 결과 출력: 결과를 화면에 출력하고자 할 경우, 터미널에 결과를 출력합니다.
- 반복 실행: interval 주기마다 위의 모든 과정을 반복하며, exec_time이 0일 경우 무한 실행됩니다.
보완 사항
- 사용자 권한 제한: 일반 사용자가 Apache 관련 정보를 조회할 수 있도록 기본적으로 필요한 명령어들로 구성하였으나, 일부 명령어가 실행되지 않을 경우 sudo 권한이 필요할 수 있습니다.
- 오류 처리: 명령어 실행이 실패할 경우 오류 메시지를 반환하도록 설정하여 프로그램이 중단되지 않도록 했습니다.
궁금한 점이 있거나 추가 기능이 필요하시면 말씀해 주세요!
내가 요청하지 않았지만 추가된 부분은 키보드인터럽트(Ctrl+C) 처리와 리눅스 명령어(top -bn1 | head -n 10)의 보완이었습니다.
※ 참고사항 : 위 내용으로 작성해서 정상 작동하는 것을 확인했습니다.
※ 주의사항 : ChatGPT가 생성한 글이므로 이 점을 고려해서 읽으시기를 권장합니다.
728x90
반응형
'웹서핑을 즐기며' 카테고리의 다른 글
[ChatGPT] 아파치가 요청 받고 처리해서 응답한 시간을 로그에 기록하여 보았습니다. (0) | 2024.11.13 |
---|---|
[ChatGPT] 아파치 MPM prefork의 각 항목과 설정 방법에 대해 살펴보았습니다. (0) | 2024.11.12 |
[ChatGPT] 하루 중에 발은 언제 가장 큽니까? 언제 신발을 사면 좋을까요? (0) | 2024.11.11 |
[ChatGPT] 리눅스, 아파치에서 검색 로봇 접근을 특정 요일에만 막고 싶은데, 설정 방법이 있나요? (18) | 2024.11.04 |
[ChatGPT] 장고(Django)에서 소스 변경 후 웹서버(아파치)를 재시작하지 않고 적용 시킬 수 있는 방법에 대해 알아보았습니다. (4) | 2024.11.02 |
댓글