실습> 접근제어

Server# systemctl stop firewalld
Server# systemctl disable firewalld
Server# yum -y install iptables-services
Server# iptables -A INPUT -p icmp -s 200.200.200.1 -j DROP
Server# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 200.200.200.1 0.0.0.0/0
cmd에서 200.200.200.3으로 ping test를 하면 접근이 금지된다.
C:\Users\user>ping 200.200.200.3
Ping 200.200.200.3 32바이트 데이터 사용:
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
요청 시간이 만료되었습니다.
200.200.200.3에 대한 Ping 통계:
패킷: 보냄 = 4, 받음 = 0, 손실 = 4 (100% 손실),
Server# iptables -F
Server# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
C:\Users\user>ping 200.200.200.3
Ping 200.200.200.3 32바이트 데이터 사용:
200.200.200.3의 응답: 바이트=32 시간<1ms TTL=64
200.200.200.3의 응답: 바이트=32 시간<1ms TTL=64
200.200.200.3의 응답: 바이트=32 시간<1ms TTL=64
200.200.200.3의 응답: 바이트=32 시간<1ms TTL=64
200.200.200.3에 대한 Ping 통계:
패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
최소 = 0ms, 최대 = 0ms, 평균 = 0ms
실습> 접근제어 테스트
방화벽: 외부에서 불법적인 접근을 차단하는 보안 솔루션
CentOS 6: iptables 방화벽
CentOS 7: firewalld 방화벽 (iptables 기반), iptables 방화벽
1. 방화벽 설정
firewalld를 중지하고 비활성화하고 iptables 방화벽을 설치하고 활성화 한다.
firewalld Off , iptables On
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl enable iptables
systemctl start iptables

2. 접속 테스트
방화벽 룰을 모두 삭제하고 Client에서 접속을 시도한다.
방화벽 룰이 없기 때문에 Client1, Client2 둘 다 접속이 가능하다.
-F: 방화벽 룰을 초기화
설정되어 있는 방화벽 룰을 초기화 한다.
Server# iptables -F
클라이언트가 서버로 ssh 접속을 한다.
Client1> ssh root@200.200.200.4 <-- 접속 허용 cmd에서 실행한다.
Client2# ssh root@200.200.200.4 <-- 접속 허용 쉘에서 실행한다.
Server# w
09:38:43 up 15 min, 2 users, load average: 0.05, 0.03, 0.03
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 200.200.200.1 09:29 3.00s 0.03s 0.02s w
root pts/1 200.200.200.3 09:38 19.00s 0.00s 0.00s -bash
3. 방화벽 룰 설정
방화벽 룰을 설정한다.
200.200.200.1에서 오는 방화벽 룰 정책을 설정한다.
-A INPUT: 패킷이 들어오는 문(체인)
-s 200.200.200.1: 출발지 IP주소가 200.200.200.1
-p tcp --dport 22: TCP 의 목적지 주소가 22번 포트(SSH)
-j ACCEPT: 패킷 허용
간단히 말하면 200.200.200.1에서 오는 패킷은 SSH접속을 허용한다.
Server# iptables -A INPUT -s 200.200.200.1 -p tcp --dport 22 -j ACCEPT
200.200.200.3에서 오는 방화벽 룰 정책을 설정한다.
-A INPUT: 패킷이 들어오는 문(체인)
-s 200.200.200.3: 출발지 IP주소가 200.200.200.3
-p tcp --dport 22: TCP 의 목적지 주소가 22번 포트(SSH)
-j DROP: 패킷 거부
간단히 말하면 200.200.200.3에서 오는 패킷은 SSH접속을 거부한다.
Server# iptables -A INPUT -s 200.200.200.3 -p tcp --dport 22 -j DROP
4. 접속 테스트
Client1에서는 방화벽 룰이 허용되었기 때문에 접속이 가능하다.
Client2에서는 방화벽 룰이 거부가 되었기 때문에 접속이 불가능하다.
Client1>ssh root@200.200.200.4
root@200.200.200.4's password:
Last login: Fri Jan 13 10:23:13 2023 from 200.200.200.1
Server#
Client2# ssh root@200.200.200.4
<-- 멈춰있다. (200.200.200.4 방화벽에서 패킷을 모두 버리므로 반응이 없는 것이다.)
5. 설정 초기화
테스트가 끝나면 방화벽 룰을 모두 삭제한다.
Server# iptables -F
로그 디렉터리: /var/log
로그 파일의 종류
-바이너리 파일(이진파일): 로그의 내용을 전용 명령어를 이용해서 본다.
-텍스트 파일: 로그의 내용을 텍스트를 보는 명령어를 이용해서 본다.
실습> 바이너리 로그 확인
1. 바이너리 파일 확인
[root@localhost ~]# ll /var/log/wtmp
-rw-rw-r--. 1 root utmp 34176 1월 13 10:30 /var/log/wtmp
[root@localhost ~]# file /var/log/wtmp
/var/log/wtmp: data
[root@localhost ~]# cat /var/log/wtmp
<-- 바이너리 파일이므로 cat으로 보면 깨진다.
/var/run/utmp: w 명령어가 참고하는 파일
[root@localhost ~]# file /var/run/utmp
/var/run/utmp: data
[root@localhost ~]# tail /var/run/utmp
<-- 바이너리 파일이므로 tail로 보면 깨진다.

2. 전용 명령어 테스트
/var/run/utmp: 전용 명령어 w로 확인이 가능하다.
[root@localhost ~]# w
11:04:26 up 1:41, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 200.200.200.1 10:30 2.00s 0.05s 0.00s w
/var/run/utmp 파일을 홈디렉터리에 이동시키고 w 명령어를 실행하면 아무 메세지도 출력되지 않는다.
[root@localhost ~]# mv /var/run/utmp ~
[root@localhost ~]# w
11:05:29 up 1:42, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
<-- 파일이 없기 때문에 아무것도 출력되지 않는다.
[root@localhost ~]# mv utmp /var/run/
[root@localhost ~]# w
11:07:20 up 1:44, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 200.200.200.1 10:30 0.00s 0.05s 0.00s w
실습> 로그 확인
/var/log: 리눅스에서 로그가 저장되는 디렉터리
/var/log/secure: ssh로 접속하는 정보가 저장되는 파일
1. 로그 모니터링
tail -f: 실시가 로그 모니터링 옵션으로 텍스트 파일만 가능하다.
이전 로그의 내용을 출력 리다이렉션으로 삭제하고 실시간 모니터링을 실시한다.
[root@localhost ~]# > /var/log/secure
[root@localhost ~]# ll /var/log/secure
-rw-------. 1 root root 0 1월 13 11:10 /var/log/secure
[root@localhost ~]# tail -f /var/log/secure
2. 로그인
Host OS에서 로그인 한다.
로그인 실패 2번, 로그인 성공 1번을 시도한다.
C:\Users\user>ssh root@200.200.200.4
root@200.200.200.4's password: <-- 첫 번째 로그인 실패
Permission denied, please try again.
root@200.200.200.4's password: <-- 두 번째 로그인 실패
Permission denied, please try again.
root@200.200.200.4's password: <-- 세 번째 로그인 성공
Last failed login: Fri Jan 13 11:14:11 KST 2023 from 200.200.200.1 on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Fri Jan 13 10:30:29 2023 from 200.200.200.1
[root@localhost ~]#
[root@localhost ~]# tail -f /var/log/secure
첫 번째 로그인 실패된 후 저장된 메세지
Jan 13 11:12:46 localhost unix_chkpwd[2314]: password check failed for user (root)
Jan 13 11:12:46 localhost sshd[2312]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=200.200.200.1 user=root
Jan 13 11:12:46 localhost sshd[2312]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jan 13 11:12:48 localhost sshd[2312]: Failed password for root from 200.200.200.1 port 19789 ssh2
두 번째 로그인 실패된 후 저장된 메세지
Jan 13 11:14:10 localhost unix_chkpwd[2315]: password check failed for user (root)
Jan 13 11:14:10 localhost sshd[2312]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jan 13 11:14:11 localhost sshd[2312]: Failed password for root from 200.200.200.1 port 19789 ssh2
세 번째 로그인 성공된 후 저장된 메세지
Jan 13 11:14:38 localhost sshd[2312]: Accepted password for root from 200.200.200.1 port 19789 ssh2
Jan 13 11:14:39 localhost sshd[2312]: pam_unix(sshd:session): session opened for user root by (uid=0)
실습> pstree 명령어
첫 번째 실행하는 프로세스
CentOS 6: init (PID 1)
CentOS 7: systemd (PID 1)
[root@localhost ~]# yum -y install psmisc
[root@localhost ~]# pstree -p

실습> ps 명령어
프로세스를 확인하는 명령어
[root@localhost ~]# ps -a
[root@localhost ~]# ps -e
[root@localhost ~]# ps -A
[root@localhost ~]# ps -f
[root@localhost ~]# ps -l
[root@localhost ~]# ps -u
[root@localhost ~]# ps -x
로그인 후 자신에게 할당된 터미널 번호를 출력한다.
[root@localhost ~]# tty
/dev/pts/0
[root@localhost ~]# ls -ld /dev/pts
drwxr-xr-x. 2 root root 0 1월 12 22:02 /dev/pts
[root@localhost ~]# ps
PID TTY TIME CMD
1729 pts/0 00:00:00 bash
2563 pts/0 00:00:00 ps
TTY: 어느 터미널에 속해 있는지 알려준다.
TTY에 ? 가 있으면 터미널에 종속되지 않은 프로세스들
TTY에 터미널 번호(/dev/pts/0) 가 있으면 그 터미널에 종속된 프로세스들
[root@localhost ~]# ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
5 ? 00:00:00 kworker/u256:0
6 ? 00:00:00 ksoftirqd/0
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 rcu_sched
10 ? 00:00:00 lru-add-drain
11 ? 00:00:00 watchdog/0
13 ? 00:00:00 kdevtmpfs
14 ? 00:00:00 netns
15 ? 00:00:00 khungtaskd
16 ? 00:00:00 writeback
17 ? 00:00:00 kintegrityd
18 ? 00:00:00 bioset
19 ? 00:00:00 bioset
20 ? 00:00:00 bioset
21 ? 00:00:00 kblockd
22 ? 00:00:00 md
23 ? 00:00:00 edac-poller
24 ? 00:00:00 watchdogd
30 ? 00:00:00 kswapd0
31 ? 00:00:00 ksmd
32 ? 00:00:00 khugepaged
33 ? 00:00:00 crypto
41 ? 00:00:00 kthrotld
43 ? 00:00:00 kmpath_rdacd
44 ? 00:00:00 kaluad
45 ? 00:00:00 kpsmoused
47 ? 00:00:00 ipv6_addrconf
60 ? 00:00:00 deferwq
96 ? 00:00:00 kauditd
272 ? 00:00:00 mpt_poll_0
273 ? 00:00:00 mpt/0
274 ? 00:00:00 nfit
275 ? 00:00:00 ata_sff
283 ? 00:00:00 scsi_eh_0
284 ? 00:00:00 scsi_tmf_0
285 ? 00:00:00 kworker/u256:2
286 ? 00:00:00 scsi_eh_1
287 ? 00:00:00 scsi_tmf_1
288 ? 00:00:00 scsi_eh_2
289 ? 00:00:00 scsi_tmf_2
291 ? 00:00:00 irq/16-vmwgfx
292 ? 00:00:00 ttm_swap
394 ? 00:00:00 kdmflush
395 ? 00:00:00 bioset
405 ? 00:00:00 kdmflush
406 ? 00:00:00 bioset
418 ? 00:00:00 bioset
419 ? 00:00:00 xfsalloc
420 ? 00:00:00 xfs_mru_cache
421 ? 00:00:00 xfs-buf/dm-0
422 ? 00:00:00 xfs-data/dm-0
423 ? 00:00:00 xfs-conv/dm-0
424 ? 00:00:00 xfs-cil/dm-0
425 ? 00:00:00 xfs-reclaim/dm-
426 ? 00:00:00 xfs-log/dm-0
427 ? 00:00:00 xfs-eofblocks/d
428 ? 00:00:00 xfsaild/dm-0
429 ? 00:00:00 kworker/0:1H
508 ? 00:00:00 systemd-journal
529 ? 00:00:00 lvmetad
539 ? 00:00:00 systemd-udevd
591 ? 00:00:00 bioset
593 ? 00:00:00 bioset
594 ? 00:00:00 bioset
595 ? 00:00:00 bioset
598 ? 00:00:00 md1_raid1
619 ? 00:00:00 raid5wq
623 ? 00:00:00 bioset
625 ? 00:00:00 bioset
627 ? 00:00:00 md5_raid5
671 ? 00:00:00 xfs-buf/md5
672 ? 00:00:00 xfs-buf/md0
673 ? 00:00:00 xfs-buf/sda1
674 ? 00:00:00 xfs-buf/md1
675 ? 00:00:00 xfs-data/md5
676 ? 00:00:00 xfs-data/md0
677 ? 00:00:00 xfs-data/sda1
678 ? 00:00:00 xfs-data/md1
679 ? 00:00:00 xfs-conv/md5
680 ? 00:00:00 xfs-conv/md0
681 ? 00:00:00 xfs-conv/sda1
682 ? 00:00:00 xfs-conv/md1
683 ? 00:00:00 xfs-cil/md5
684 ? 00:00:00 xfs-cil/md0
685 ? 00:00:00 xfs-cil/sda1
686 ? 00:00:00 xfs-cil/md1
687 ? 00:00:00 xfs-reclaim/md5
688 ? 00:00:00 xfs-reclaim/md0
689 ? 00:00:00 xfs-reclaim/sda
690 ? 00:00:00 xfs-reclaim/md1
691 ? 00:00:00 xfs-log/md5
692 ? 00:00:00 xfs-log/md0
693 ? 00:00:00 xfs-log/sda1
694 ? 00:00:00 xfs-log/md1
695 ? 00:00:00 xfs-eofblocks/m
696 ? 00:00:00 xfs-eofblocks/m
697 ? 00:00:00 xfs-eofblocks/s
698 ? 00:00:00 xfs-eofblocks/m
699 ? 00:00:00 xfsaild/md5
700 ? 00:00:00 xfsaild/md0
701 ? 00:00:00 xfsaild/sda1
702 ? 00:00:00 xfsaild/md1
725 ? 00:00:00 auditd
749 ? 00:00:00 polkitd
751 ? 00:00:00 systemd-logind
752 ? 00:00:00 dbus-daemon
756 ? 00:00:00 chronyd
764 ? 00:00:00 NetworkManager
773 ? 00:00:00 crond
778 tty1 00:00:00 agetty
997 ? 00:00:00 httpd
999 ? 00:00:00 sshd
1000 ? 00:00:01 tuned
1004 ? 00:00:00 rsyslogd
1051 ? 00:00:00 mysqld_safe
1100 ? 00:00:00 httpd
1101 ? 00:00:00 httpd
1103 ? 00:00:00 httpd
1106 ? 00:00:00 httpd
1108 ? 00:00:00 httpd
1313 ? 00:00:03 mysqld
1725 ? 00:00:00 sshd
1729 pts/0 00:00:00 bash
2352 ? 00:00:00 kworker/0:3
2475 ? 00:00:00 kworker/0:0
2560 ? 00:00:00 kworker/0:1
2564 ? 00:00:00 kworker/0:2
2565 pts/0 00:00:00 ps
[root@localhost ~]# sleep 1000 &
[1] 2567
[root@localhost ~]# ps
PID TTY TIME CMD
1729 pts/0 00:00:00 bash
2567 pts/0 00:00:00 sleep <-- TTY 부분에 pts/0(첫 번째 터미널)에서 실행되었다라는 의미이다.
2568 pts/0 00:00:00 ps
[root@localhost ~]# tty
/dev/pts/0
UID: 프로그램을 실행시킨 사용자 ID
PID: 현재 자신의 프로세스 번호
PPID: 부모 프로세스 번호
[root@localhost ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1729 1725 0 10:30 pts/0 00:00:00 -bash
root 2567 1729 0 12:14 pts/0 00:00:00 sleep 1000
root 2570 1729 0 12:16 pts/0 00:00:00 ps -f
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1729 1725 0 80 0 - 28913 do_wai pts/0 00:00:00 bash
0 S 0 2567 1729 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
0 R 0 2571 1729 0 80 0 - 38331 - pts/0 00:00:00 ps
실습> 전체 프로세스 확인
ps aux : 전체 프로세스 확인
ps -ef : 전체 프로세스 확인
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128296 6940 ? Ss 09:22 0:01 /usr/lib/systemd/systemd --switched-root -
root 2 0.0 0.0 0 0 ? S 09:22 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 09:22 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 09:22 0:00 [kworker/u256:0]
root 6 0.0 0.0 0 0 ? S 09:22 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 09:22 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 09:22 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 09:22 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 09:22 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 09:22 0:00 [watchdog/0]
root 13 0.0 0.0 0 0 ? S 09:22 0:00 [kdevtmpfs]
root 14 0.0 0.0 0 0 ? S< 09:22 0:00 [netns]
root 15 0.0 0.0 0 0 ? S 09:22 0:00 [khungtaskd]
root 16 0.0 0.0 0 0 ? S< 09:22 0:00 [writeback]
root 17 0.0 0.0 0 0 ? S< 09:22 0:00 [kintegrityd]
root 18 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 19 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 20 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 21 0.0 0.0 0 0 ? S< 09:22 0:00 [kblockd]
root 22 0.0 0.0 0 0 ? S< 09:22 0:00 [md]
root 23 0.0 0.0 0 0 ? S< 09:22 0:00 [edac-poller]
root 24 0.0 0.0 0 0 ? S< 09:22 0:00 [watchdogd]
root 30 0.0 0.0 0 0 ? S 09:22 0:00 [kswapd0]
root 31 0.0 0.0 0 0 ? SN 09:22 0:00 [ksmd]
root 32 0.0 0.0 0 0 ? SN 09:22 0:00 [khugepaged]
root 33 0.0 0.0 0 0 ? S< 09:22 0:00 [crypto]
root 41 0.0 0.0 0 0 ? S< 09:22 0:00 [kthrotld]
root 43 0.0 0.0 0 0 ? S< 09:22 0:00 [kmpath_rdacd]
root 44 0.0 0.0 0 0 ? S< 09:22 0:00 [kaluad]
root 45 0.0 0.0 0 0 ? S< 09:22 0:00 [kpsmoused]
root 47 0.0 0.0 0 0 ? S< 09:22 0:00 [ipv6_addrconf]
root 60 0.0 0.0 0 0 ? S< 09:22 0:00 [deferwq]
root 96 0.0 0.0 0 0 ? S 09:22 0:00 [kauditd]
root 272 0.0 0.0 0 0 ? S< 09:22 0:00 [mpt_poll_0]
root 273 0.0 0.0 0 0 ? S< 09:22 0:00 [mpt/0]
root 274 0.0 0.0 0 0 ? S< 09:22 0:00 [nfit]
root 275 0.0 0.0 0 0 ? S< 09:22 0:00 [ata_sff]
root 283 0.0 0.0 0 0 ? S 09:22 0:00 [scsi_eh_0]
root 284 0.0 0.0 0 0 ? S< 09:22 0:00 [scsi_tmf_0]
root 285 0.0 0.0 0 0 ? S 09:22 0:00 [kworker/u256:2]
root 286 0.0 0.0 0 0 ? S 09:22 0:00 [scsi_eh_1]
root 287 0.0 0.0 0 0 ? S< 09:22 0:00 [scsi_tmf_1]
root 288 0.0 0.0 0 0 ? S 09:22 0:00 [scsi_eh_2]
root 289 0.0 0.0 0 0 ? S< 09:22 0:00 [scsi_tmf_2]
root 291 0.0 0.0 0 0 ? S 09:22 0:00 [irq/16-vmwgfx]
root 292 0.0 0.0 0 0 ? S< 09:22 0:00 [ttm_swap]
root 394 0.0 0.0 0 0 ? S< 09:22 0:00 [kdmflush]
root 395 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 405 0.0 0.0 0 0 ? S< 09:22 0:00 [kdmflush]
root 406 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 418 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 419 0.0 0.0 0 0 ? S< 09:22 0:00 [xfsalloc]
root 420 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs_mru_cache]
root 421 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-buf/dm-0]
root 422 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-data/dm-0]
root 423 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-conv/dm-0]
root 424 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-cil/dm-0]
root 425 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-reclaim/dm-]
root 426 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-log/dm-0]
root 427 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-eofblocks/d]
root 428 0.0 0.0 0 0 ? S 09:22 0:00 [xfsaild/dm-0]
root 429 0.0 0.0 0 0 ? S< 09:22 0:00 [kworker/0:1H]
root 508 0.0 0.3 37088 3080 ? Ss 09:22 0:00 /usr/lib/systemd/systemd-journald
root 529 0.0 0.6 192908 6180 ? Ss 09:22 0:00 /usr/sbin/lvmetad -f
root 539 0.0 0.5 48896 5400 ? Ss 09:22 0:00 /usr/lib/systemd/systemd-udevd
root 591 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 593 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 594 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 595 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 598 0.0 0.0 0 0 ? S 09:22 0:00 [md1_raid1]
root 619 0.0 0.0 0 0 ? S< 09:22 0:00 [raid5wq]
root 623 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 625 0.0 0.0 0 0 ? S< 09:22 0:00 [bioset]
root 627 0.0 0.0 0 0 ? S 09:22 0:00 [md5_raid5]
root 671 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-buf/md5]
root 672 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-buf/md0]
root 673 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-buf/sda1]
root 674 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-buf/md1]
root 675 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-data/md5]
root 676 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-data/md0]
root 677 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-data/sda1]
root 678 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-data/md1]
root 679 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-conv/md5]
root 680 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-conv/md0]
root 681 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-conv/sda1]
root 682 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-conv/md1]
root 683 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-cil/md5]
root 684 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-cil/md0]
root 685 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-cil/sda1]
root 686 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-cil/md1]
root 687 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-reclaim/md5]
root 688 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-reclaim/md0]
root 689 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-reclaim/sda]
root 690 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-reclaim/md1]
root 691 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-log/md5]
root 692 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-log/md0]
root 693 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-log/sda1]
root 694 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-log/md1]
root 695 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-eofblocks/m]
root 696 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-eofblocks/m]
root 697 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-eofblocks/s]
root 698 0.0 0.0 0 0 ? S< 09:22 0:00 [xfs-eofblocks/m]
root 699 0.0 0.0 0 0 ? S 09:22 0:00 [xfsaild/md5]
root 700 0.0 0.0 0 0 ? S 09:22 0:00 [xfsaild/md0]
root 701 0.0 0.0 0 0 ? S 09:22 0:00 [xfsaild/sda1]
root 702 0.0 0.0 0 0 ? S 09:22 0:00 [xfsaild/md1]
root 725 0.0 0.0 55532 860 ? S<sl 09:22 0:00 /sbin/auditd
polkitd 749 0.0 1.1 612236 11232 ? Ssl 09:22 0:00 /usr/lib/polkit-1/polkitd --no-debug
root 751 0.0 0.1 26384 1768 ? Ss 09:22 0:00 /usr/lib/systemd/systemd-logind
dbus 752 0.0 0.2 66452 2576 ? Ssl 09:22 0:00 /usr/bin/dbus-daemon --system --address=sy
chrony 756 0.0 0.1 117808 1848 ? S 09:22 0:00 /usr/sbin/chronyd
root 764 0.0 0.9 554996 9208 ? Ssl 09:22 0:00 /usr/sbin/NetworkManager --no-daemon
root 773 0.0 0.1 126388 1680 ? Ss 09:22 0:00 /usr/sbin/crond -n
root 778 0.0 0.0 110204 860 tty1 Ss+ 09:22 0:00 /sbin/agetty --noclear tty1 linux
root 997 0.0 1.3 408300 13512 ? Ss 09:22 0:00 /usr/sbin/httpd -DFOREGROUND
root 999 0.0 0.4 112900 4360 ? Ss 09:22 0:00 /usr/sbin/sshd -D
root 1000 0.0 1.7 574284 17452 ? Ssl 09:22 0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root 1004 0.0 0.4 214432 4408 ? Ssl 09:22 0:00 /usr/sbin/rsyslogd -n
mysql 1051 0.0 0.1 113412 1604 ? Ss 09:22 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/us
apache 1100 0.0 0.6 408436 6748 ? S 09:22 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1101 0.0 0.6 408436 6748 ? S 09:22 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1103 0.0 0.6 408436 6748 ? S 09:22 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1106 0.0 0.6 408436 6748 ? S 09:22 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1108 0.0 0.6 408436 6748 ? S 09:22 0:00 /usr/sbin/httpd -DFOREGROUND
mysql 1313 0.0 8.7 970948 87432 ? Sl 09:22 0:03 /usr/libexec/mysqld --basedir=/usr --datad
root 1725 0.0 0.5 158904 5608 ? Ss 10:30 0:00 sshd: root@pts/0
root 1729 0.0 0.2 115652 2168 pts/0 Ss 10:30 0:00 -bash
root 2352 0.0 0.0 0 0 ? R 11:44 0:01 [kworker/0:3]
root 2566 0.0 0.0 0 0 ? S 12:13 0:00 [kworker/0:0]
root 2567 0.0 0.0 108052 356 pts/0 S 12:14 0:00 sleep 1000
root 2572 0.0 0.0 0 0 ? S 12:18 0:00 [kworker/0:1]
root 2573 0.0 0.1 155448 1868 pts/0 R+ 12:19 0:00 ps aux
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:22 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deseri
root 2 0 0 09:22 ? 00:00:00 [kthreadd]
root 4 2 0 09:22 ? 00:00:00 [kworker/0:0H]
root 5 2 0 09:22 ? 00:00:00 [kworker/u256:0]
root 6 2 0 09:22 ? 00:00:00 [ksoftirqd/0]
root 7 2 0 09:22 ? 00:00:00 [migration/0]
root 8 2 0 09:22 ? 00:00:00 [rcu_bh]
root 9 2 0 09:22 ? 00:00:00 [rcu_sched]
root 10 2 0 09:22 ? 00:00:00 [lru-add-drain]
root 11 2 0 09:22 ? 00:00:00 [watchdog/0]
root 13 2 0 09:22 ? 00:00:00 [kdevtmpfs]
root 14 2 0 09:22 ? 00:00:00 [netns]
root 15 2 0 09:22 ? 00:00:00 [khungtaskd]
root 16 2 0 09:22 ? 00:00:00 [writeback]
root 17 2 0 09:22 ? 00:00:00 [kintegrityd]
root 18 2 0 09:22 ? 00:00:00 [bioset]
root 19 2 0 09:22 ? 00:00:00 [bioset]
root 20 2 0 09:22 ? 00:00:00 [bioset]
root 21 2 0 09:22 ? 00:00:00 [kblockd]
root 22 2 0 09:22 ? 00:00:00 [md]
root 23 2 0 09:22 ? 00:00:00 [edac-poller]
root 24 2 0 09:22 ? 00:00:00 [watchdogd]
root 30 2 0 09:22 ? 00:00:00 [kswapd0]
root 31 2 0 09:22 ? 00:00:00 [ksmd]
root 32 2 0 09:22 ? 00:00:00 [khugepaged]
root 33 2 0 09:22 ? 00:00:00 [crypto]
root 41 2 0 09:22 ? 00:00:00 [kthrotld]
root 43 2 0 09:22 ? 00:00:00 [kmpath_rdacd]
root 44 2 0 09:22 ? 00:00:00 [kaluad]
root 45 2 0 09:22 ? 00:00:00 [kpsmoused]
root 47 2 0 09:22 ? 00:00:00 [ipv6_addrconf]
root 60 2 0 09:22 ? 00:00:00 [deferwq]
root 96 2 0 09:22 ? 00:00:00 [kauditd]
root 272 2 0 09:22 ? 00:00:00 [mpt_poll_0]
root 273 2 0 09:22 ? 00:00:00 [mpt/0]
root 274 2 0 09:22 ? 00:00:00 [nfit]
root 275 2 0 09:22 ? 00:00:00 [ata_sff]
root 283 2 0 09:22 ? 00:00:00 [scsi_eh_0]
root 284 2 0 09:22 ? 00:00:00 [scsi_tmf_0]
root 285 2 0 09:22 ? 00:00:00 [kworker/u256:2]
root 286 2 0 09:22 ? 00:00:00 [scsi_eh_1]
root 287 2 0 09:22 ? 00:00:00 [scsi_tmf_1]
root 288 2 0 09:22 ? 00:00:00 [scsi_eh_2]
root 289 2 0 09:22 ? 00:00:00 [scsi_tmf_2]
root 291 2 0 09:22 ? 00:00:00 [irq/16-vmwgfx]
root 292 2 0 09:22 ? 00:00:00 [ttm_swap]
root 394 2 0 09:22 ? 00:00:00 [kdmflush]
root 395 2 0 09:22 ? 00:00:00 [bioset]
root 405 2 0 09:22 ? 00:00:00 [kdmflush]
root 406 2 0 09:22 ? 00:00:00 [bioset]
root 418 2 0 09:22 ? 00:00:00 [bioset]
root 419 2 0 09:22 ? 00:00:00 [xfsalloc]
root 420 2 0 09:22 ? 00:00:00 [xfs_mru_cache]
root 421 2 0 09:22 ? 00:00:00 [xfs-buf/dm-0]
root 422 2 0 09:22 ? 00:00:00 [xfs-data/dm-0]
root 423 2 0 09:22 ? 00:00:00 [xfs-conv/dm-0]
root 424 2 0 09:22 ? 00:00:00 [xfs-cil/dm-0]
root 425 2 0 09:22 ? 00:00:00 [xfs-reclaim/dm-]
root 426 2 0 09:22 ? 00:00:00 [xfs-log/dm-0]
root 427 2 0 09:22 ? 00:00:00 [xfs-eofblocks/d]
root 428 2 0 09:22 ? 00:00:00 [xfsaild/dm-0]
root 429 2 0 09:22 ? 00:00:00 [kworker/0:1H]
root 508 1 0 09:22 ? 00:00:00 /usr/lib/systemd/systemd-journald
root 529 1 0 09:22 ? 00:00:00 /usr/sbin/lvmetad -f
root 539 1 0 09:22 ? 00:00:00 /usr/lib/systemd/systemd-udevd
root 591 2 0 09:22 ? 00:00:00 [bioset]
root 593 2 0 09:22 ? 00:00:00 [bioset]
root 594 2 0 09:22 ? 00:00:00 [bioset]
root 595 2 0 09:22 ? 00:00:00 [bioset]
root 598 2 0 09:22 ? 00:00:00 [md1_raid1]
root 619 2 0 09:22 ? 00:00:00 [raid5wq]
root 623 2 0 09:22 ? 00:00:00 [bioset]
root 625 2 0 09:22 ? 00:00:00 [bioset]
root 627 2 0 09:22 ? 00:00:00 [md5_raid5]
root 671 2 0 09:22 ? 00:00:00 [xfs-buf/md5]
root 672 2 0 09:22 ? 00:00:00 [xfs-buf/md0]
root 673 2 0 09:22 ? 00:00:00 [xfs-buf/sda1]
root 674 2 0 09:22 ? 00:00:00 [xfs-buf/md1]
root 675 2 0 09:22 ? 00:00:00 [xfs-data/md5]
root 676 2 0 09:22 ? 00:00:00 [xfs-data/md0]
root 677 2 0 09:22 ? 00:00:00 [xfs-data/sda1]
root 678 2 0 09:22 ? 00:00:00 [xfs-data/md1]
root 679 2 0 09:22 ? 00:00:00 [xfs-conv/md5]
root 680 2 0 09:22 ? 00:00:00 [xfs-conv/md0]
root 681 2 0 09:22 ? 00:00:00 [xfs-conv/sda1]
root 682 2 0 09:22 ? 00:00:00 [xfs-conv/md1]
root 683 2 0 09:22 ? 00:00:00 [xfs-cil/md5]
root 684 2 0 09:22 ? 00:00:00 [xfs-cil/md0]
root 685 2 0 09:22 ? 00:00:00 [xfs-cil/sda1]
root 686 2 0 09:22 ? 00:00:00 [xfs-cil/md1]
root 687 2 0 09:22 ? 00:00:00 [xfs-reclaim/md5]
root 688 2 0 09:22 ? 00:00:00 [xfs-reclaim/md0]
root 689 2 0 09:22 ? 00:00:00 [xfs-reclaim/sda]
root 690 2 0 09:22 ? 00:00:00 [xfs-reclaim/md1]
root 691 2 0 09:22 ? 00:00:00 [xfs-log/md5]
root 692 2 0 09:22 ? 00:00:00 [xfs-log/md0]
root 693 2 0 09:22 ? 00:00:00 [xfs-log/sda1]
root 694 2 0 09:22 ? 00:00:00 [xfs-log/md1]
root 695 2 0 09:22 ? 00:00:00 [xfs-eofblocks/m]
root 696 2 0 09:22 ? 00:00:00 [xfs-eofblocks/m]
root 697 2 0 09:22 ? 00:00:00 [xfs-eofblocks/s]
root 698 2 0 09:22 ? 00:00:00 [xfs-eofblocks/m]
root 699 2 0 09:22 ? 00:00:00 [xfsaild/md5]
root 700 2 0 09:22 ? 00:00:00 [xfsaild/md0]
root 701 2 0 09:22 ? 00:00:00 [xfsaild/sda1]
root 702 2 0 09:22 ? 00:00:00 [xfsaild/md1]
root 725 1 0 09:22 ? 00:00:00 /sbin/auditd
polkitd 749 1 0 09:22 ? 00:00:00 /usr/lib/polkit-1/polkitd --no-debug
root 751 1 0 09:22 ? 00:00:00 /usr/lib/systemd/systemd-logind
dbus 752 1 0 09:22 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork
chrony 756 1 0 09:22 ? 00:00:00 /usr/sbin/chronyd
root 764 1 0 09:22 ? 00:00:00 /usr/sbin/NetworkManager --no-daemon
root 773 1 0 09:22 ? 00:00:00 /usr/sbin/crond -n
root 778 1 0 09:22 tty1 00:00:00 /sbin/agetty --noclear tty1 linux
root 997 1 0 09:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 999 1 0 09:22 ? 00:00:00 /usr/sbin/sshd -D
root 1000 1 0 09:22 ? 00:00:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root 1004 1 0 09:22 ? 00:00:00 /usr/sbin/rsyslogd -n
mysql 1051 1 0 09:22 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
apache 1100 997 0 09:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1101 997 0 09:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1103 997 0 09:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1106 997 0 09:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 1108 997 0 09:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
mysql 1313 1051 0 09:22 ? 00:00:03 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysq
root 1725 999 0 10:30 ? 00:00:00 sshd: root@pts/0
root 1729 1725 0 10:30 pts/0 00:00:00 -bash
root 2352 2 0 11:44 ? 00:00:01 [kworker/0:3]
root 2566 2 0 12:13 ? 00:00:00 [kworker/0:0]
root 2567 1729 0 12:14 pts/0 00:00:00 sleep 1000
root 2572 2 0 12:18 ? 00:00:00 [kworker/0:1]
root 2574 1729 0 12:19 pts/0 00:00:00 ps -ef
실습> 실시간 프로세스 확인하기
$HOME/.toprc: top 명령어의 설정파일
-기본값은 존재하지 않는다.
-사용자가 W로 생성해야 한다.
[root@localhost ~]# top
q, Ctrl + c: top 명령어 종료
top 에서 단축키
h: 도움말
f: 컬럼 추가/삭제
space: 컬럼 토글
오른쪽 방향키: 컬럼 위치 변경
W: 설정값 저장 ($HOME/.toprc)
top 명령어를 실행하면 $HOME/.toprc 파일을 확인해서 있으면 그 내용대로 실행하고 없으면 기본값으로 실행한다.
###########
📌 시그널 📌
###########
시그널의 종류가 저장된 헤더 파일
헤더 파일: C 언어로 프로그램을 작성할 때 미리 선언된 변수와 함수의 프로토타입이 선언이 들어있는 파일
/usr/include: C언어의 헤더 파일이 모여있는 디렉터리
/usr/include/signal.h
/usr/include/bits/signum.h

POSIX : https://ko.wikipedia.org/wiki/POSIX
[root@localhost ~]# yum -y install gcc
#define 이름 값
/usr/include/signal.h 파일의 내용중 일부
#include <bits/signum.h>
/usr/include/bits/signum.h 파일의 내용중 일부
/ Signals. /
#define SIGHUP 1 / Hangup (POSIX). /
#define SIGINT 2 / Interrupt (ANSI). /
#define SIGQUIT 3 / Quit (POSIX). /
#define SIGILL 4 / Illegal instruction (ANSI). /
#define SIGTRAP 5 / Trace trap (POSIX). /
#define SIGABRT 6 / Abort (ANSI). /
#define SIGIOT 6 / IOT trap (4.2 BSD). /
#define SIGBUS 7 / BUS error (4.2 BSD). /
#define SIGFPE 8 / Floating-point exception (ANSI). /
#define SIGKILL 9 / Kill, unblockable (POSIX). /
#define SIGUSR1 10 / User-defined signal 1 (POSIX). /
#define SIGSEGV 11 / Segmentation violation (ANSI). /
#define SIGUSR2 12 / User-defined signal 2 (POSIX). /
#define SIGPIPE 13 / Broken pipe (POSIX). /
#define SIGALRM 14 / Alarm clock (POSIX). /
#define SIGTERM 15 / Termination (ANSI). /
#define SIGSTKFLT 16 / Stack fault. /
#define SIGCLD SIGCHLD / Same as SIGCHLD (System V). /
#define SIGCHLD 17 / Child status has changed (POSIX). /
#define SIGCONT 18 / Continue (POSIX). /
#define SIGSTOP 19 / Stop, unblockable (POSIX). /
#define SIGTSTP 20 / Keyboard stop (POSIX). /
#define SIGTTIN 21 / Background read from tty (POSIX). /
#define SIGTTOU 22 / Background write to tty (POSIX). /
#define SIGURG 23 / Urgent condition on socket (4.2 BSD). /
#define SIGXCPU 24 / CPU limit exceeded (4.2 BSD). /
#define SIGXFSZ 25 / File size limit exceeded (4.2 BSD). /
#define SIGVTALRM 26 / Virtual alarm clock (4.2 BSD). /
#define SIGPROF 27 / Profiling alarm clock (4.2 BSD). /
#define SIGWINCH 28 / Window size change (4.3 BSD, Sun). /
#define SIGPOLL SIGIO / Pollable event occurred (System V). /
#define SIGIO 29 / I/O now possible (4.2 BSD). /
#define SIGPWR 30 / Power failure restart (System V). /
#define SIGSYS 31 / Bad system call. /
#define SIGUNUSED 31
kill: 프로세스에 시그널(신호)을 전달하는 명령어
-시그널을 전달할 때는 권한이 같거나 높아야 한다.
kill 명령어로 시그널을 확인한다.
[root@localhost ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
실습> define 사용하기
[root@localhost ~]# cd
[root@localhost ~]# vi defineTest.c
/*
#include <stdio.h>
#define SIGINT 2
#define SIGKILL 9
#define SIGTERM 15
int main()
{
printf("SIGINT: %d\n", SIGINT);
printf("SIGKILL: %d\n", SIGKILL);
printf("SIGTERM: %d\n", SIGTERM);
return 0;
}
[root@localhost ~]# gcc -o defineTest defineTest.c
[root@localhost ~]# ./defineTest
SIGINT: 2
SIGKILL: 9
SIGTERM: 15
참고: https://cafe.naver.com/linuxmasternet/122
[root@localhost ~]# gcc -o defineTest.i -E defineTest.c
[root@localhost ~]# vi defineTest.i
[root@localhost ~]# vi defineTest2.c
/*
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int main()
{
printf("TRUE: %d\n", TRUE);
printf("FALSE: %d\n", FALSE);
return 0;
}
[root@localhost ~]# gcc -o defineTest2.i -E defineTest2.c
define 처리가 되어 있는 코드는 전처리 단계에서 값으로 모두 대체된다.
[root@localhost ~]# vi defineTest2.i
:
:(생략)
int main()
{
printf("TRUE: %d\n", 1); // TRUE는 1로 변경
printf("FALSE: %d\n", 0); // FALSE는 0으로 변경
return 0;
}
실습> 프로세스 종료
sleep 명령어는 프로세스를 잠시 멈추는 명령어
형식: sleep 초
sleep 명령어는 15번 시그널을 블로킹 할 수 없다.
그러므로 15번 시그널을 받으면 종료한다.
[root@localhost ~]# sleep 5 <-- 5초 중지
[root@localhost ~]# time sleep 3 <-- 3초 중지
real 0m3.002s
user 0m0.001s
sys 0m0.000s
[root@localhost ~]# time sleep 1000
<-- 엔터키를 여러 번 친다.
^C
real 0m37.323s
user 0m0.001s
sys 0m0.000s
sleep 을 다시 실행한다.
[root@localhost ~]# time sleep 2000
다른 터미널을 열어서 sleep의 PID를 확인해서 SIGINT 시그널을 전송하면 PID 2667번의 sleep 명령어는 종료된다.
[root@localhost ~]# ps aux|grep sleep
root 2667 0.0 0.0 108052 360 pts/0 S+ 14:37 0:00 sleep 2000
root 2690 0.0 0.1 116972 1024 pts/1 S+ 14:38 0:00 grep --color=auto sleep
[root@localhost ~]# kill -2 2667


실습> 프로세스에 신호 보내기
SIGSTOP(19): 기본값은 프로세스 중지
/dev/pts/0# sleep 1000
<-- 프로세스가 멈춰있다.
/dev/pts/1# ps -ef|grep sleep
root 2798 1729 0 15:01 pts/0 00:00:00 sleep 1000
root 2800 2746 0 15:02 pts/1 00:00:00 grep --color=auto sleep
/dev/pts/1# kill -SIGSTOP 2798
/dev/pts/0# sleep 1000
[1]+ Stopped sleep 1000
/dev/pts/0# jobs
[1]+ Stopped sleep 1000
/dev/pts/1# kill -SIGCONT 2798
/dev/pts/0# jobs
[1]+ Running sleep 1000 &
SIGTERM(15)
SIGTERM(15)번 신호를 받는 프로세스는 종료된다.
단 프로세스에서 블로킹이 되어 있다면 종료를 못한다.
이유는 SIGTERM(15) 시그널은 막을 수 있기 때문이다.
/dev/pts/0# sleep 2000
/dev/pts/1# ps -ef | grep sleep
root 2804 1729 0 15:12 pts/0 00:00:00 sleep 2000
root 2806 2746 0 15:13 pts/1 00:00:00 grep --color=auto sleep
/dev/pts/1# kill -SIGTERM 2804
/dev/pts/0# sleep 3000
/dev/pts/1# ps -ef | grep sleep
root 2807 1729 0 15:13 pts/0 00:00:00 sleep 3000
root 2809 2746 0 15:13 pts/1 00:00:00 grep --color=auto sleep
/dev/pts/1# kill -15 2807
/dev/pts/0# sleep 3000
종료됨
실습> 15번 시그널 블로킹하기
[root@localhost ~]# vi signalTest.c
/*
#include <stdio.h> // printf
#include <unistd.h> // sleep
int main()
{
int count = 1;
while(1)
{
printf("%d\n", count);
sleep(1);
++count;
}
return 0;
}
[root@localhost ~]# gcc -o signalTest signalTest.c
[root@localhost ~]# ./signalTest
1
2
3
:
:(생략)
21
22
23
24
./signalTest 프로세스는 15번 시그널을 블로킹 하지 못하기 때문에 15번 시그널을 받으로 프로세스가 종료된다.
[root@localhost ~]# ps -ef|grep signalTest
root 2872 1729 0 15:30 pts/0 00:00:00 ./signalTest
root 2874 2746 0 15:31 pts/1 00:00:00 grep --color=auto signalTest
[root@localhost ~]# kill -15 2872
25
26
종료됨
[root@localhost ~]# cat signalTest.c
/*
#include <stdio.h> // printf
#include <unistd.h> // sleep
#include <signal.h> // signal
int main()
{
int count = 1;
signal(SIGTERM, SIG_IGN); // 15번 시그널이 오면 무시한다. (SIG_IGN: SIGNAL IGNORE)
while(1) {
printf("%d\n", count);
sleep(1);
++count;
}
return 0;
}
/dev/pts/0# gcc -o signalTest signalTest.c
/dev/pts/0# ./signalTest
1
2
3
4
/dev/pts/1# ps -ef|grep signalTest
root 2932 1729 0 15:40 pts/0 00:00:00 ./signalTest
root 2934 2746 0 15:40 pts/1 00:00:00 grep --color=auto signalTest
SIGTERM(15) 시그널을 PID 2932에게 전송해도 종료가 안된다.
이유는 SIGTERM(15) 블로킹처리를 했기 때문이다.
/dev/pts/1# kill -15 2932
/dev/pts/1# kill -15 2932
21
22
23
^C <-- Ctrl + C 를 누르면 프로세스가 종료된다.
[root@localhost ~]# vi signalTest.c
/*
#include <stdio.h> // printf
#include <unistd.h> // sleep
#include <signal.h> // signal
int main()
{
int count = 1;
signal(SIGTERM, SIG_IGN); // 15번 시그널 블로킹
signal(SIGINT, SIG_IGN); // 2번 시그널 블로킹
while(1) {
printf("%d\n", count);
sleep(1);
++count;
}
return 0;
}
/dev/pts/0# gcc -o signalTest signalTest.c
/dev/pts/0# ./signalTest
1
2
^C^C3 <-- Ctrl + C를 눌러도 반응이 없다. 무시했기 때문이다.
^C^C^C^C^C4 <-- Ctrl + C를 눌러도 반응이 없다. 무시했기 때문이다.
5
6
7
8
9
10
11
12
13
:
:(생략)
41
42
43
44
45
46
SIGTERM(15) 신호를 보내도 반응이 없다. 이유는 블로킹했기 때문이다.
/dev/pts/1# ps -ef|grep signalTest
root 2944 1729 0 15:45 pts/0 00:00:00 ./signalTest
root 2946 2746 0 15:45 pts/1 00:00:00 grep --color=auto signalTest
/dev/pts/1# kill -15 2944
48
49
50
51
52
53
54
55
:
:(생략)
/dev/pts/1# kill -9 2944 <-- kill -SIGKILL 2944
157
158
죽었음
실습> 윈도우에서 C언어 작성한 프로그램 디버깅하기
/*
#include <stdio.h>
int main()
{
int count = 1;
while (count <= 5)
{
printf("%d\n", count);
++count;
}
return 0;
}
Ctrl + 를 눌러서 컴파일해서 실행한다.
'>>> 실행 결과 <<<
1
2
3
4
5
BP 설정 후 -> 으로 분석한다.
-- count.py --
"""
파일명: count.py
프로그램 설명: while문 디버깅하기
"""
count = 1
while (count <= 5):
print("%d" %count)
count = count + 1
print("프로그램 종료")
-- count.py --
Ctrl + 를 눌러서 실행한다.
'>>> 실행 결과 <<<
1
2
3
4
5
BP 설정 후 -> 으로 분석한다.
실습> pkill 명령어
/dev/pts/0# sleep 1000
종료됨
/dev/pts/0# sleep 1000
/dev/pts/1# ps -ef|grep -E 'PID|sleep'

프로세스 이름중에서 sleep 으로 실행한 프로세스를 15번 시그널을 보낸다.
/dev/pts/1# pkill -15 sleep
SIGTERM(15)을 받은 프로세스는 특별히 블로킹 하지 않고 실행하면 프로세스는 종료된다.
/dev/pts/0# sleep 1000
종료됨
실습> 프로세스 우선순위 변경하기
프로세스가 실행할 때 우선순위를 지정하지 않으면 우선순위 값은 0으로 실행된다.
-로 갈 때는 프로세스의 우선순위가 높아진다.
+로 갈 때는 프로세스의 우선순위가 낮아진다.

[root@localhost ~]# sleep 1000 &
[1] 2980
[root@localhost ~]# renice -n 30 -p 2980
2980 (process ID) old priority 0, new priority 19
[root@localhost ~]# renice -n -30 -p 2980
2980 (process ID) old priority 19, new priority -20
실습> nice를 이용한 프로세스 우선순위 변경하기
nice: 프로그램을 실행할 때 우선순위 변경하기
renice: 이미 실행된 프로세스의 우선순위 변경하기
[root@localhost ~]# useradd user1
[root@localhost ~]# su - user1
$ sleep 1000 &
[1] 3053
$ nice -n 5 sleep 2000 &
[2] 3054
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1001 3031 3030 0 80 0 - 28886 do_wai pts/0 00:00:00 bash
0 S 1001 3053 3031 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3054 3031 0 85 5 - 27013 hrtime pts/0 00:00:00 sleep
0 R 1001 3055 3031 0 80 0 - 38331 - pts/0 00:00:00 ps
$ nice -n -1 sleep 3000 &
[3] 3056
nice: cannot set niceness: 허가 거부
일반 유저는 - 로 갈 수 없기 때문에 0으로 강제로 설정된다.
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1001 3031 3030 0 80 0 - 28886 do_wai pts/0 00:00:00 bash
0 S 1001 3053 3031 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3054 3031 0 85 5 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3056 3031 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
0 R 1001 3057 3031 0 80 0 - 38331 - pts/0 00:00:00 ps
$ renice +19 -p 3053
3053 (process ID) old priority 0, new priority 19
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1001 3031 3030 0 80 0 - 28886 do_wai pts/0 00:00:00 bash
0 S 1001 3053 3031 0 99 19 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3054 3031 0 85 5 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3056 3031 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
0 R 1001 3063 3031 0 80 0 - 38331 - pts/0 00:00:00 ps
일반 유저가 실행할 때 일단 프로세스의 우선순위가 정해지면 그 값보다 높일 수 없다.
+19 -> +5로 변경할 수 없다.
$ renice +5 -p 3053
renice: failed to set priority for 3053 (process ID): 허가 거부
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1001 3031 3030 0 80 0 - 28886 do_wai pts/0 00:00:00 bash
0 S 1001 3053 3031 0 99 19 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3054 3031 0 85 5 - 27013 hrtime pts/0 00:00:00 sleep
0 S 1001 3056 3031 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
0 R 1001 3065 3031 0 80 0 - 38331 - pts/0 00:00:00 ps
$ pkill sleep
[1] 종료됨 sleep 1000
[2]- 종료됨 nice -n 5 sleep 2000
[3]+ 종료됨 nice -n -1 sleep 3000
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1001 3031 3030 0 80 0 - 28924 do_wai pts/0 00:00:00 bash
0 R 1001 3067 3031 0 80 0 - 38331 - pts/0 00:00:00 ps
$ exit
슈퍼유저(root)가 프로세스를 실행할 때 우선순위를 높일 수 있다.
[root@localhost ~]# sleep 10000 &
[1] 3069
[root@localhost ~]# nice -n -3 sleep 20000 &
[2] 3070
[root@localhost ~]# nice -n -5 sleep 30000 &
[3] 3071
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1729 1725 0 80 0 - 28951 do_wai pts/0 00:00:00 bash
0 S 0 3069 1729 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep
4 S 0 3070 1729 0 77 -3 - 27013 hrtime pts/0 00:00:00 sleep
4 S 0 3071 1729 0 75 -5 - 27013 hrtime pts/0 00:00:00 sleep
0 R 0 3072 1729 0 80 0 - 38331 - pts/0 00:00:00 ps
관리자(root) 이므로 프로세스의 우선순위를 높일 수 있다.
[root@localhost ~]# renice -n -2 -p 3069
3069 (process ID) old priority 0, new priority -2
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1729 1725 0 80 0 - 28951 do_wai pts/0 00:00:00 bash
0 S 0 3069 1729 0 78 -2 - 27013 hrtime pts/0 00:00:00 sleep
4 S 0 3070 1729 0 77 -3 - 27013 hrtime pts/0 00:00:00 sleep
4 S 0 3071 1729 0 75 -5 - 27013 hrtime pts/0 00:00:00 sleep
0 R 0 3075 1729 0 80 0 - 38331 - pts/0 00:00:00 ps
[root@localhost ~]# pkill sleep
[1] 종료됨 sleep 10000
[2]- 종료됨 nice -n -3 sleep 20000
[3]+ 종료됨 nice -n -5 sleep 30000
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1729 1725 0 80 0 - 28951 do_wai pts/0 00:00:00 bash
0 R 0 3077 1729 0 80 0 - 38331 - pts/0 00:00:00 ps
실습> 포그라운드 프로세스 VS 백그라운드 프로세스
프로그램을 실행할 때 기본값은 포그라운드 프로세스로 실행한다.
이 기본값을 변경하고자 한다면 & 를 이용해서 프로그램을 백그라운드 프로세스로 실행한다.
형식: 명령어&
jobs, fg, bg
1. 백그라운드 프로세스로 실행
[root@localhost ~]# sleep 1000 &
[1] 3084
[root@localhost ~]# sleep 2000 &
[2] 3085
[root@localhost ~]# sleep 3000 &
[3] 3086
[root@localhost ~]# jobs
[1] Running sleep 1000 &
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
백그라운드 프로세스 -> 프그라운드 프로세스로 변경
[root@localhost ~]# fg
sleep 3000
<-- sleep 3000 이 종료되기만을 기다린다.
포그라운드 프로세스 -> 백그라운드 프로세스로 변경
fg
sleep 3000
^Z
[3]+ Stopped sleep 3000
[root@localhost ~]# jobs
[1] Running sleep 1000 &
[2]- Running sleep 2000 &
[3]+ Stopped sleep 3000
[root@localhost ~]# stty -a
susp = ^Z;
[root@localhost ~]# bg
[3]+ sleep 3000 &
[root@localhost ~]# jobs
[1] Running sleep 1000 &
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
%1: 작업 번호 1번
[root@localhost ~]# fg %1
sleep 1000
^Z
[1]+ Stopped sleep 1000
[root@localhost ~]# jobs
[1]+ Stopped sleep 1000 <-- +가 [3] -> [1]로 변경되었다.
[2] Running sleep 2000 &
[3]- Running sleep 3000 & <-- -가 [2] -> [3]으로 변경되었다.
[root@localhost ~]# bg <-- bg %1과 동일하다.
[1]+ sleep 1000 &
[root@localhost ~]# jobs
[1] Running sleep 1000 & <-- +로 되어 있는 [1]이 백그라운드 프로세스로 동작한다.
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
[root@localhost ~]# pkill sleep
[1] 종료됨 sleep 1000
[2]- 종료됨 sleep 2000
[3]+ 종료됨 sleep 3000