서버를 운영 및 유지 관리하는 과정에서 CPU 부하 모니터링, 디스크 사용량 모니터링, 프로세스 번호 모니터링 등 서버의 다양한 리소스를 모니터링하여 적절한 조치가 취해지면 즉시 알람 및 알림을 제공해야 하는 경우가 많습니다. 시스템 관리자에게 이상이 발생했습니다. 이 기사에서는 Linux 시스템에서 몇 가지 일반적인 모니터링 요구 사항과 셸 스크립트 작성을 소개합니다.
기사 디렉토리:
1.Linux는 Shell을 사용하여 프로세스가 존재하는지 확인합니다
2.Linux는 Shell을 사용하여 프로세스 CPU 사용률을 감지합니다
3.Linux는 Shell을 사용하여 프로세스 메모리 사용량을 감지합니다
4.Linux는 Shell을 사용하여 프로세스 핸들 사용을 감지합니다
5.Linux는 Shell을 사용하여 TCP 또는 UDP 포트가 수신 대기 중인지 확인합니다
6.Linux는 Shell을 사용하여 특정 프로세스 이름의 실행 중인 프로세스 수를 확인합니다
7.Linux는 Shell을 사용하여 시스템 CPU 로드를 감지합니다
8.Linux는 Shell을 사용하여 시스템 디스크 공간을 감지합니다.
9. 요약
프로세스가 존재하는지 확인
프로세스를 모니터링할 때 일반적으로 프로세스 ID를 가져와야 합니다. 프로세스 ID는 프로세스의 고유 식별자입니다. 그러나 때로는 서버에서 서로 다른 사용자로 실행되는 동일한 프로세스 이름을 가진 여러 프로세스가 있을 수 있습니다. 다음 함수 GetPID 지정된 사용자 하에서 지정된 프로세스 이름의 프로세스 ID를 가져오는 기능을 제공합니다(현재는 이 사용자 하에서 이 프로세스 이름으로 프로세스 시작을 고려함). 여기에는 사용자 이름과 프로세스 이름이라는 두 가지 매개변수가 있습니다. 먼저 ps를 사용하여 프로세스 정보를 찾고 동시에 grep을 사용하여 필요한 프로세스를 필터링하고 마지막으로 sed 및 awk를 사용하여 필요한 프로세스의 ID 값을 찾습니다(이 기능은 실제 상황에 따라 수정 가능) , 기타 정보를 필터링해야 하는 경우 등).
목록 1. 프로세스 모니터링
함수 GetPID #사용자 #이름
{
PsUser=$1
PsName=$2
pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbxn
|grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
에코 $pid
}
샘플 데모:
1) 소스 프로그램(예를 들어 사용자가 루트이고 프로세스 이름이 CFTestApp인 프로세스 ID를 찾습니다.)
PID=`GetPID 루트 CFTestApp`
에코 $PID
2) 결과 출력
11426
[dyu@xilinuxbldsrv 쉘]$
3) 결과 분석
위 출력에서 볼 수 있듯이 11426은 루트 사용자 아래 CFTestApp 프로그램의 프로세스 ID입니다.
4) 명령어 소개
1. ps: 시스템에서 즉시 프로세스 정보를 봅니다. 매개변수: -u
때로는 프로세스가 시작되지 않을 수도 있습니다. 프로세스 ID가 존재하는지 확인하는 기능은 다음과 같습니다.
프로세스가 존재하지 않습니다.
# 프로세스가 존재하는지 확인
If [ "-$PID" == "-" ]
그럼
{
echo "해당 프로세스가 존재하지 않습니다."
}
안녕
프로세스 CPU 사용률 감지
애플리케이션 서비스를 유지 관리하다 보면 CPU 사용량이 너무 많아 업무 정체 및 업무 중단을 초래하는 상황이 자주 발생합니다. 과도한 CPU는 비즈니스 과부하 또는 무한 루프와 같은 비정상적인 상황으로 인해 발생할 수 있습니다. 비즈니스 프로세스 CPU는 스크립트를 통해 지속적으로 모니터링됩니다. 적시에 업무 중단 등을 피하십시오. 다음 함수는 지정된 프로세스 ID에 대한 프로세스 CPU 사용률을 가져옵니다. 프로세스 ID에 대한 매개변수가 있습니다. 먼저 ps를 사용하여 프로세스 정보를 찾고, grep -v를 통해 %CPU 행을 필터링하고, 마지막으로 awk를 사용하여 CPU 사용률의 정수 부분을 찾습니다(여러 개가 있는 경우). 시스템의 CPU, CPU 사용률이 100%를 초과할 수 있습니다.
List 2. 업무프로세스 CPU 실시간 모니터링
GetCpu 함수
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU awk '{print $1}' awk - F. '{print $1}'`
에코 $CpuValue
}
다음 함수는 위 함수 GetCpu를 통해 이 프로세스의 CPU 사용률을 얻은 다음 조건문을 사용하여 CPU 사용률이 80%를 초과하는 경우(실제 상황에 따라 조정 가능) 여부를 확인하는 것입니다. 알람이 출력되고, 그렇지 않으면 정상적인 정보가 출력됩니다.
목록 3. CPU 사용률이 한도를 초과하는지 확인
CheckCpu 기능
{
PID=$1
cpu=`GetCpu $PID`
만약 [ $cpu -gt 80 ]
그럼
{
echo “CPU 사용량이 80%를 초과했습니다.”
}
그렇지 않으면
{
echo “CPU 사용량은 정상입니다”
}
파이
}
샘플 시연:
1) 소스 프로그램 (위에서 CFTestApp의 프로세스 ID를 11426으로 쿼리했다고 가정)
CPU 11426 확인
2) 결과 출력
CPU 사용량은 75
CPU 사용량은 정상입니다
[dyu@xilinuxbldsrv 쉘]$
3) 결과분석
위 출력에서 볼 수 있듯이 CFTestApp 프로그램의 현재 CPU 사용량은 75%이며 이는 정상이며 80% 경보 제한을 초과하지 않습니다.
프로세스 메모리 사용량 감지
응용 프로그램 서비스를 유지 관리하다 보면 과도한 메모리 사용으로 인해 프로세스가 충돌하여 업무가 중단되는 상황이 자주 발생합니다(예: 32비트 프로그램의 주소 지정 가능한 최대 메모리 공간은 4G입니다. 이를 초과하면 메모리 응용 프로그램이 실패하고 실제 메모리도 제한됩니다. 과도한 메모리 사용량은 메모리 누수, 메시지 누적 등으로 인해 발생할 수 있습니다. 비즈니스 프로세스의 메모리 사용량을 스크립트를 통해 지속적으로 모니터링하여 메모리 사용량이 비정상적일 때 적시에(예: SMS를 통해) 알람을 보낼 수 있습니다. 유지보수 담당자가 적시에 이를 처리할 수 있습니다. 다음 함수는 지정된 프로세스 ID에 대한 프로세스 메모리 사용량을 가져옵니다. 프로세스 ID에 대한 매개변수가 있으며, 먼저 ps를 사용하여 프로세스 정보를 찾고, grep -v를 통해 VSZ 라인을 필터링한 다음, 1000으로 나누어 메모리 사용량을 메가바이트 단위로 가져옵니다.
목록 4. 비즈니스 프로세스의 메모리 사용량 모니터링
GetMem 함수
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
에코 $MEMUsage
}
다음 함수는 위 함수 GetMem을 통해 이 프로세스의 메모리 사용량을 얻은 다음 조건문을 사용하여 메모리 사용량이 1.6G를 초과하는지 여부를 확인하는 것입니다(실제 상황에 따라 조정 가능). 알람이 출력되고, 그렇지 않으면 정상적인 정보가 출력됩니다.
목록 5. 메모리 사용량이 한도를 초과하는지 확인
mem=`GetMem $PID` if [ $mem -gt 1600 ]
그럼
{
echo “메모리 사용량이 1.6G보다 큽니다.”
}
그렇지 않으면
{
echo “메모리 사용량은 정상입니다”
}
안녕
1) 소스 프로그램 (위에서 CFTestApp의 프로세스 ID를 11426으로 쿼리했다고 가정)
echo "메모리 사용량은 $mem M입니다."
만약 [ $mem -gt 1600 ]
그럼
{
echo "메모리 사용량이 1.6G보다 큽니다."
}
그렇지 않으면
{
echo "메모리 사용량은 정상입니다"
}
안녕
메모리 사용량은 정상입니다
[dyu@xilinuxbldsrv 쉘]$
위 출력에서 볼 수 있듯이 CFTestApp 프로그램의 현재 메모리 사용량은 248M이며 이는 정상이며 1.6G 경보 제한을 초과하지 않습니다.
프로세스 핸들 사용 감지
애플리케이션 서비스를 유지 관리할 때 과도한 핸들 사용으로 인해 업무 중단이 발생하는 경우가 많습니다. 각 플랫폼에서 프로세스 핸들의 사용은 제한되어 있습니다. 예를 들어 Linux 플랫폼에서는 ulimit –n 명령(파일 열기(-n) 1024)을 사용하거나 /etc/security/limits.conf의 내용을 볼 수 있습니다. 프로세스 핸들 제한을 가져옵니다. 과도한 핸들 사용은 과도한 부하, 핸들 누수 등으로 인해 발생할 수 있습니다. 업무 프로세스의 핸들 사용은 스크립트를 통해 지속적으로 모니터링되며, 이상 발생 시 적시에 알림(예: SMS를 통해)을 전송하여 유지 관리 담당자가 확인할 수 있습니다. 적시에 처리하십시오. 다음 함수는 지정된 프로세스 ID에 대한 프로세스 핸들 사용량을 가져옵니다. 프로세스 ID에 대한 매개변수가 하나 있습니다. 먼저 ls를 사용하여 프로세스 핸들 정보를 출력한 다음 wc -l을 사용하여 출력 핸들 수를 계산합니다.
{
DES=`ls /proc/$1/fd wc -l`
$DES 에코
}
if [ $des -gt 900 ]
그럼
{
echo “des 개수가 900보다 큽니다.”
}
그렇지 않으면
{
echo “des 개수는 정상입니다”
}
안녕
샘플 데모:
1) 소스 프로그램 (위 쿼리에서 찾은 CFTestApp의 프로세스 ID가 11426이라고 가정)
des=`GetDes 11426`
echo "des의 개수는 $des입니다."
만약 [ $des -gt 900 ]
그럼
{
echo "des 개수가 900보다 큽니다."
}
그렇지 않으면
{
echo "des 개수는 정상입니다."
}
안녕
2) 결과 출력
데의 수는 528
데스 갯수는 정상입니다
[dyu@xilinuxbldsrv 쉘]$
3) 결과분석
위 출력에서 볼 수 있듯이 CFTestApp 프로그램의 현재 핸들 사용량은 528이며 이는 정상이며 900 알람 제한을 초과하지 않습니다.
4) 명령어 소개
wc: 지정된 파일의 바이트, 단어, 줄 수를 계산하고 통계 결과를 표시 및 출력합니다. 매개변수: -l은 행 수를 계산합니다. -c는 바이트를 계산합니다. -w 단어 수를 계산합니다.
TCP 또는 UDP 포트가 수신 대기 중인지 확인
포트 감지는 시스템 리소스 감지에서 자주 발생하며, 특히 네트워크 통신 상황에서는 포트 상태 감지가 매우 중요한 경우가 많습니다. 때로는 프로세스, CPU, 메모리 등은 정상적인 상태인데 포트가 비정상 상태가 되어 비즈니스가 정상적으로 운영되지 않는 경우가 있습니다. 다음 함수는 지정된 포트가 수신 대기 중인지 여부를 확인할 수 있습니다. 감지할 포트에 대한 매개변수가 있습니다. 먼저 netstat를 사용하여 포트 점유 정보를 출력한 다음 grep, awk 및 wc를 통해 수신 대기 중인 TCP 포트 수를 필터링합니다. 두 번째 명령문은 모니터링하는 UDP 포트 수를 출력합니다. .TCP 및 UDP 포트 수신이 모두 0이면 0을 반환하고, 그렇지 않으면 1을 반환합니다.
목록 6. 포트 감지
기능 듣기
{
TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' wc -l`
UDPListeningnum=`netstat -an|grep ":$1 " n
|awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' wc -l`
(( Listeningnum = TCPListeningnum UDPListeningnum ))
만약 [ $Listeningnum == 0 ]
그럼
{
에코 "0"
}
그렇지 않으면
{
에코 "1"
}
파이
}
1) 소스 프로그램(예: 포트 8080의 상태를 쿼리하여 수신 중인지 확인)
만약 [ $isListen -eq 1 ]
그럼
{
echo "포트가 수신 중입니다."
}
그렇지 않으면
{
echo "포트가 수신 대기 중이 아닙니다."
}
안녕
[dyu@xilinuxbldsrv 쉘]$
3) 결과분석
위 출력에서 볼 수 있듯이 이 Linux 서버의 포트 8080은 수신 대기 상태입니다.
4) 명령어 소개
netstat: IP, TCP, UDP, ICMP 프로토콜과 관련된 통계 데이터를 표시하는 데 사용됩니다. 일반적으로 머신의 각 포트의 네트워크 연결을 확인하는 데 사용됩니다. 매개변수: -a는 연결의 모든 소켓을 표시합니다. -n 도메인 네임 서버를 통하지 않고 IP 주소를 직접 사용합니다.
다음 함수는 특정 TCP 또는 UDP 포트가 정상 상태인지 여부도 감지합니다.
tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}'
udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}'
명령어 소개
egrep: 파일에서 지정된 문자열을 찾습니다. egrep의 실행 효과는 grep -E와 같습니다. 사용되는 구문과 매개 변수는 grep 명령을 참조할 수 있습니다. grep과의 차이점은 문자열을 해석하기 위해 확장 정규 표현식 구문을 사용하는 반면 grep은 기본 정규 표현식을 사용합니다. 구문, 확장 정규식은 기본 정규식보다 더 완전한 표현식 사양을 갖습니다.
특정 프로세스 이름의 실행 중인 프로세스 수 보기
때때로 서버에서 시작된 프로세스 수를 가져와야 할 수도 있습니다. 다음 함수는 실행 중인 프로세스 수를 감지하는 것입니다. 예를 들어 프로세스 이름은 CFTestApp입니다.
Runnum=`ps -ef | grep -v tail | grep "[ /]CFTestApp" | grep -v wc -l
서버 유지 관리를 수행할 때 과도한 시스템 CPU(사용률) 부하로 인해 업무 중단이 발생하는 경우가 있습니다. 서버에서 여러 프로세스가 실행 중일 수 있습니다. 단일 프로세스의 CPU를 보는 것은 정상이지만 전체 시스템의 CPU 부하가 비정상적일 수 있습니다. 시스템 CPU 부하를 스크립트를 통해 지속적으로 모니터링하고, 이상 발생 시 적시에 알람을 보내 유지보수 담당자가 적시에 처리하고 사고를 예방할 수 있습니다. 다음 함수는 시스템 CPU 사용량을 감지할 수 있습니다. vmstat를 사용하여 시스템 CPU의 유휴 값을 5회 가져오고 평균을 낸 후 그 차이를 100에서 계산하여 실제 CPU 사용량 값을 가져옵니다.
{
CpuIdle=`vmstat 1 5 |sed -n '3,$p' n
|awk '{x = x $15} END {print x/5}' |awk -F '{print $1}'
CpuNum=`echo "100-$CpuIdle" bc`
에코 $CpuNum
}
1) 소스 프로그램
echo "시스템 CPU는 $cpu입니다."
if [ $cpu -gt 90 ]
그럼
{
echo "시스템 CPU 사용량이 90%보다 큽니다."
}
그렇지 않으면
{
echo "시스템 CPU 사용량은 정상입니다."
}
안녕
시스템 CPU 사용량은 정상입니다
[dyu@xilinuxbldsrv 쉘]$
3) 결과 분석
위 출력에서 볼 수 있듯이 현재 Linux 서버 시스템의 CPU 사용률은 87%이며 이는 정상이며 90% 경보 제한을 초과하지 않습니다.
4) 명령어 소개
vmstat: Virtual Meomory Statistics(가상 메모리 통계)의 약자로 운영체제의 가상 메모리, 프로세스, CPU 활동을 모니터링할 수 있습니다.
매개변수: -n은 출력 헤더 정보가 주기적인 루프 출력 중에 한 번만 표시됨을 나타냅니다.
시스템 디스크 공간 확인
시스템 디스크 공간 감지는 시스템 리소스 감지의 중요한 부분입니다. 시스템 유지 관리 중에 서버 디스크 공간 사용량을 확인해야 하는 경우가 많습니다. 일부 기업에서는 수시로 통화 메모, 로그 또는 임시 파일을 작성해야 하기 때문에 디스크 공간을 모두 사용하면 업무 중단이 발생할 수도 있습니다. 다음 기능은 현재 시스템에서 디렉토리의 디스크 공간 사용량을 감지할 수 있습니다. 입력 매개변수 감지해야 하는 디렉토리 이름에 대해 df를 사용하여 시스템 디스크 공간 사용량 정보를 출력한 다음 grep 및 awk를 통해 필터링하여 특정 디렉토리의 디스크 공간 사용량 비율을 얻습니다.
GetDiskSpc 함수
{
만약 [ $# -ne 1 ]
그럼
1개 반환
파이
폴더="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'
에코 $DiskSpace
}
샘플 데모:
1) 소스 프로그램(탐지 디렉터리는 /boot)
폴더="/부팅"
DiskSpace=`GetDiskSpc $Folder`
echo "시스템 $Folder 디스크 공간은 $DiskSpace%입니다."
if [ $DiskSpace -gt 90 ]
그럼
{
echo "시스템 디스크($Folder) 사용량이 90%를 초과했습니다."
}
그렇지 않으면
{
echo "시스템 디스크($Folder) 사용량은 정상입니다."
}
안녕
2) 결과 출력
시스템/부팅 디스크 공간은 14%
시스템 디스크(/boot)의 사용은 정상입니다
[dyu@xilinuxbldsrv 쉘]$
3) 결과분석
위 출력에서 이 Linux 서버 시스템의 /boot 디렉터리에 있는 디스크 공간의 14%가 사용되었음을 알 수 있습니다. 이는 정상이며 90% 사용 경보 제한을 초과하지 않습니다.
4) 명령어 소개
df: 파일 시스템의 디스크 공간 사용량을 확인합니다. 이 명령을 사용하면 하드 디스크가 얼마나 많은 공간을 차지하고 있는지, 현재 남은 공간은 얼마나 되는지 등의 정보를 얻을 수 있습니다. 매개변수: -k k 바이트로 표시합니다.
요약
Linux 플랫폼에서 쉘 스크립트 모니터링은 서버와 프로세스를 모니터링하는 매우 간단하고 편리하며 효과적인 방법입니다. 시스템 개발자와 프로세스 유지관리자에게 매우 유용합니다. 위 정보를 모니터링하고 알람을 보낼 수 있을 뿐만 아니라 프로세스 로그 및 기타 정보도 모니터링할 수 있습니다. 이 기사가 모든 사람에게 도움이 되기를 바랍니다.

<p>定制您的操作系统是让您的日常生活更加愉快的绝佳方式。您可以更改用户界面、应用自定义主题、添加小部件等等。因此,我们今天将向您展示如何在Windows11上安装ClassicShell。</p><p>该程序已经存在了很长时间,并允许您修改操作系统。志愿者现在已经开始运营该组织,该组织于2017年解散。新项目名为OpenShell,目前在Github上可供感兴趣的人使用。</p>&a
![Explorer.exe 在系统启动时不启动 [修复]](https://img.php.cn/upload/article/000/887/227/168575230155539.png)
如今,许多Windows用户开始遇到严重的Windows系统问题。问题是系统加载后Explorer.exe无法启动,用户无法打开文件或文件夹。虽然,Windows用户在某些情况下可以使用命令提示符手动打开Windows资源管理器,并且每次系统重新启动或系统启动后都必须这样做。这可能是有问题的,并且是由于下面提到的以下因素造成的。损坏的系统文件。启用快速启动设置。过时或有问题的显示驱动程序。对系统中的某些服务进行了更改。修改后的注册表文件。请记住以上所有因素,我们提出了一些肯定会对用户有所帮助

您在运行脚本时是否看到此错误消息“Add-AppxPackage:部署失败,HRESULT:0x80073D02,无法安装该包,因为它修改的资源当前正在使用中。PowerShell中出现错误0x80073D02…”?如错误消息所述,当用户在前一个进程运行时尝试重新注册一个或所有WindowsShellExperienceHost应用程序时,确实会发生这种情况。我们已经获得了一些简单的解决方案来快速解决这个问题。修复1–终止体验主机进程您必须在执行powershell命令之前结束

Linux系统下在处理文件时,有时候需要删除文件末尾的行。这种操作在实际应用中很常见,可以通过一些简单的命令来实现。本文将介绍在Linux系统中快速删除文件末尾行的操作步骤,同时提供具体的代码示例。步骤一:查看文件末尾行在进行删除操作之前,首先需要确认文件的末尾行是哪一行。可以使用tail命令来查看文件的末尾行,具体命令如下:tail-n1filena

适用于 Linux 的 Windows 子系统第一种选择是使用适用于 Linux 或 WSL 的 Windows 子系统,这是一个兼容层,用于在 Windows 系统上本地运行 Linux 二进制可执行文件。它适用于大多数场景,允许您在 Windows 11/10 中运行 shell 脚本。WSL 不会自动可用,因此您必须通过 Windows 设备的开发人员设置启用它。您可以通过转到设置 > 更新和安全 > 对于开发人员来完成。切换到开发人员模式并通过选择是确认提示。接下来,查找 W

无法在Windows 11上运行的 Open shell 并不是一个新问题,并且自从这个新操作系统问世以来一直困扰着用户。Open-Shell Windows 11 不工作问题的原因并不具体。它可能是由程序中的意外错误、病毒或恶意软件的存在或损坏的系统文件引起的。对于那些不知道的人,Open-Shell 是 2017 年停产的 Classic Shell 的替代品。您可以查看我们的教程,了解如何在 Windows 11 上安装 Classic Shell。如何替换 Windows 11 的开始菜

Python 脚本部分实例:企业微信告警、FTP 客户端、SSH 客户端、Saltstack 客户端、vCenter 客户端、获取域名 ssl 证书过期时间、发送今天的天气预报以及未来的天气趋势图;Shell 脚本部分实例:SVN 完整备份、Zabbix 监控用户密码过期、构建本地 YUM 以及上篇文章中有读者的需求(负载高时,查出占用比较高的进程脚本并存储或推送通知);篇幅有些长,还请大家耐心翻到文末,毕竟有彩蛋。Python 脚本部分企业微信告警此脚本通过企业微信应用,进行微信告警,可用于

OpenShell是一个免费的软件实用程序,可用于自定义Windows11开始菜单,使其类似于经典风格的菜单或Windows7样式的菜单。以前版本的Windows上的开始菜单为用户提供了一种浏览其系统内容的简单方法。基本上,OpenShell是ClassicShell的替代品,它提供了不同的用户界面元素,有助于从以前的Windows版本获取后一个版本的功能。一旦ClassicShell的开发在2017年停止,它就由GitHub志愿者以OpenShell的名义维护和开发。它与Win


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

뜨거운 주제



