반응형

타 프로젝트에서 지원 요청 온 것 들 중 하나가 리눅스 시스템에서의 메모리 관리입니다.
아시다시피 리눅스 시스템에서는 BSD계열이나 아니냐 등의 이유로 메모리 확인 방법은 조금씩 차이가 납니다.
일단 리눅스에서 메모리 확인 방법들에 대해 정리해봅니다.

1.top

개인적으로 많은 용도로 가장 빈번하게 활용하고 있습니다.^^;
총 메모리 사용량을 모니터링하는데 주로 사용하는데, 프로세스 당 메모리와 CPU사용량도 보여줍니다. 아래 설명할 free 명령어처럼 buffer와 cache 정보도 확인할 수 있습니다.
여기서 짚고 넘어가야 할 것은, 기본적으로 리눅스는 가장 빠른 성능을 위해 실행 중인 프로세스들이 요청하는 메모리를 제외한 메모리들 중 거의 대부분을 Disk cache로 사용한다는 점이다.
top 명령어를 실행해 보면 이를 알 수 있는데, Mem영역의 free 메모리 사이즈보다 Swap영역의 cached Mem 사이즈가 훨씬 큰 것을 볼 수 있다.
명령어를 실행하면 실시간 모니터링이 되는데, 옵션 키들을 사용할 수 있다.
shift + m - 메모리 사용량 우선순위 정렬
shift + p - CPU 사용량 우선순위 정렬
shift + t - 실행 시간 우선순위 정렬
shift + b -  상단 정보를 블럭 형태로 표시(htop과 유사)
1 - CPU 개수별 사용량
space bar - Refresh
u - 해당 유저의 프로스세만 표시
k - 해당 프로세스 kill


예)
top - 12:36:47 up 7 days,  5:55,  4 users,  load average: 1.40, 1.16, 1.03
Tasks: 222 total,   2 running, 219 sleeping,   0 stopped,   1 zombie
%Cpu(s):  7.5 us, 15.7 sy,  0.2 ni, 76.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  12286940 total, 12027384 used,   259556 free,   415392 buffers
KiB Swap: 10239996 total,      240 used, 10239756 free.  1674928 cached Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                 
 2111 mingyu.+  20   0 1482888 112584  59068 S  19.2  0.9   1534:59 compiz      
...

전체 물리 메모리 : 12286940 total (:=실 가용 메모리 + 실 사용 메모리)
실 가용 메모리 = free + buffers + cached Mem
: 259556 free + 415392 buffers + 1674928 cached Mem
실 사용 메모리 = used - (buffers + cached Mem)
: 12027384 used - (415392 buffers + 1674928 cached Mem)

2. htop

top 명령어의 또 다른 버전(???)!
개인적으로 잘 쓰지 않는데, 그 이유는 따로 설치를 해야하는 Util 명령어이다.
하지만 취향에 따라 자주 이용하는 사람들도 있으니 한번 테스트해보시고 판단해보시길^^;
조금 더 다양한 옵션이 있으니 활용해 보시길^^;

3. free

메모리 사용량을 확인할 때 사용하는 가장 단순하고 쉬운 명령어.
커널에서 사용하는 공유메모리/버퍼 양 표시
-/+ buffers/cache: 현재 cache 메모리에서 버퍼링된 사용량

-m : MB단위로 데이터 표시
-b : byte단위로 데이터 표시
-k : kilo byte 단위로 데이터 표시
-t : 맨 마지막에 total 량 표시
-o : buffer/cache 표시 안함
-s : 지정한 초단위(Regular interval)로 refresh
-l : low & High 메모리 크기 통계
-V : free명령의 버전 표시

예) free -m
                        total       used       free     shared    buffers     cached
Mem:         11998      11646        352         73        369       1581
-/+ buffers/cache:       9695       2303
Swap:         9999          0       9999

전체 물리 메모리 : 11998 MB (:=실 가용 메모리 + 실 사용 메모리)
실 가용 메모리 2303 MB(free) = free + buffers + cached Mem
: 352 MB(free) + 369 MB(buffers) + 1581 MB(cached Mem)
실 사용 메모리 9695 MB(used) = used - (buffers + cached Mem)
: 11646 MB(used) - (369 MB:buffers + 1581 MB cached Mem)

참고) from zetawiki
MEM_TOTAL=`free | grep ^Mem | awk '{print $2}'`
MEM_FREE1=`free | grep ^Mem | awk '{print $4}'`
MEM_FREE2=`free | grep ^-/+ | awk '{print $4}'`
MEM_NOMINAL=`echo "100-(100*$MEM_FREE1/$MEM_TOTAL)" | bc -l`
MEM_ACTUAL=`echo "100-(100*$MEM_FREE2/$MEM_TOTAL)" | bc -l`
echo NOMINAL=${MEM_NOMINAL:0:5}% ACTUAL=${MEM_ACTUAL:0:5}%

4. vmstat -s

아래에서 다룰 proc 명령어와 같이 메모리 사용량 통계를 나타낸다.
예)
     12286940 K total memory
     11925908 K used memory
      3084736 K active memory
      1780388 K inactive memory
       361032 K free memory
       378504 K buffer memory
      1619516 K swap cache
     10239996 K total swap
          240 K used swap
     10239756 K free swap
     18765788 non-nice user cpu ticks
       222821 nice user cpu ticks
     34041747 system cpu ticks
    196753601 idle cpu ticks
       137429 IO-wait cpu ticks
          817 IRQ cpu ticks
        27674 softirq cpu ticks
            0 stolen cpu ticks
     29867564 pages paged in
     71060804 pages paged out
            0 pages swapped in
           61 pages swapped out
   1121367295 interrupts
   2630490277 CPU context switches
   1456695684 boot time
        34179 forks


5. /proc/meminfo

/proc/meminfo 파일을 읽으면 아래와 같이 vmstat -s, free 명령어와 유사한 메모리 사용량을 확인할 수 있다. 단, /proc 파일 시스템은 실제 파일이 아니라 커널과 시스템에 대한 동적인 정보를 담고 있는 가상 파일이다.
예) cat /proc/meminfo
MemTotal:       12286940 kB
MemFree:          354672 kB
Buffers:          378504 kB
Cached:          1619800 kB
SwapCached:            0 kB
Active:          3092044 kB
Inactive:        1779796 kB
Active(anon):    2097608 kB
Inactive(anon):   851532 kB
Active(file):     994436 kB
Inactive(file):   928264 kB
Unevictable:          32 kB
Mlocked:              32 kB
SwapTotal:      10239996 kB
SwapFree:       10239756 kB
Dirty:              1164 kB
Writeback:             0 kB
AnonPages:       2873720 kB
Mapped:          6757036 kB
Shmem:             75504 kB
Slab:             488308 kB
SReclaimable:     393892 kB
SUnreclaim:        94416 kB
KernelStack:        5968 kB
PageTables:        51824 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16383464 kB
Committed_AS:   13987488 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      160940 kB
VmallocChunk:   34359492360 kB
HardwareCorrupted:     0 kB
AnonHugePages:   1406976 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       92416 kB
DirectMap2M:    12472320 kB

(참고)
프로세스의 PID를 알고 있다면
> cat /proc/"PID"/status 입력 시
VmSize : 전체 할당된 가상 메모리 크기
VmRSS : 실제 물리 메모리가 할당된 크기
VmLck : Swapout될 수 없는 메모리 크기
VmData : Heap 영역
VmStk : Stack 영역
VmExe :  실행코드 영역 (전역변수/실행코드)
VmLib : 동적 연결된 라이브러리 영역

C Code )
char cmd[1024];
sprintf(cmd, "/proc/%d/status", getpid();
FILE* fp = fopen(cmd, "r");
if(fp == NULL) return;

int nVmSize =0;
int nVmRss =0;

while(fgets(cmd, 1024, fp) != NULL) {
  if(strstr(cmd, "VmSize"))  {
    char t[32];
    char size[32];
    sscanf(cmd, "%s%s", t, size);
    nVmSize = atoi(size);
  } else if(strstr(cmd, "VmRSS")) {
    char t[32];
    char size[32];
    sscanf(cmd, "%s%s", t, size);
    nVmRss = atoi(size);
    break;
  }
fclose(fp);

6. ps

> ps -ef --sort -rss
rss(Resident Set Size) : 물리 메모리를 실제 점유하고 있는 크기
가장 위에 있는 프로세스가 물리 메모리를 가장 많이 점유하고 있음!

> ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,comm --sort -rss | head -n 11
예)
USER       PID  PPID   RSS  SIZE    VSZ %MEM %CPU     TIME COMMAND
mingyu.+  4885  4860 6622604 1662480 8779996 53.8 54.1 3-23:01:30 VirtualBox
mingyu.+ 10870  1771 955232 2542152 3321996  7.7 10.0 12:45:13 firefox
mingyu.+  5824  5821 895860 4640832 5418932  7.2 1.6 02:54:53 java
mingyu.+  2235  1771 235232 592760 1280776  1.9 0.0 00:08:27 thunderbird
mingyu.+ 31928  1771 215452 1913348 2753128  1.7 0.0 00:00:19 software-center
...

7. dmidecode

설치된 RAM 하드웨어 정보 표시.
type 17이 RAM. (그 외 L1/L2 cache 등)
예) dmidecode -t 17
# dmidecode 2.12
SMBIOS 2.7 present.
Handle 0x001A, DMI type 17, 34 bytes
Memory Device
 Array Handle: 0x0019
 Error Information Handle: 0x001C
 Total Width: 64 bits
 Data Width: 64 bits
 Size: 8192 MB
 Form Factor: SODIMM
 Set: None
 Locator: ChannelA-DIMM0
 Bank Locator: BANK 0
 Type: DDR3
 Type Detail: Synchronous
 Speed: 1333 MHz
 Manufacturer: Samsung
 Serial Number: 2343574B
 Asset Tag: 0123456789
 Part Number: M471B1G73BH0-CH9 
 Rank: Unknown
 Configured Clock Speed: 1333 MHz


8. GUI Tools

gnome - gnome-system-monitor
KDE - ksysguard

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

Ubuntu에 PostgreSQL 설치하고 기본명령(Select, Insert Update, Delete)를 살펴봅시다.

먼저 apt-get을 업데이트 해줍니다. 그리고 postgresql을 설치 합니다.

$ sudo apt-get update
$ sudo apt-get install postgresql postgresql-contrib

postgresql을 설치하면 postgres라는 계정이 생성된다.

postgres 계정으로 변경해 보자. postgres 계정은 postgresql을 관리하는 계정이다.

$ sudo -i -u postgres

postgres 계정으로 변경 후 postgresql로 들어가보자. 명령은 psql이다.

$ psql
psql (9.3.18)
Type "help" for help.

postgres=# 

현재 설치된 버전은 postgresql 9.3.18인걸 알 수 있다.

postgresql에서 나가려면 \q 명령이다.

postgres=# \q

sudo 계정으로 postgresql에 접속하려면 아래처럼 하면 된다.

$ sudo -u postgres psql
psql (9.3.18)
Type "help" for help.

postgres=#

postgres 계정으로 새로운 postgresql 계정을 만들려면 createuser 명령으로 하고 --interactive 플레그를 주면 된다.

명령을 치면 추가할 계정과 superuser인지 묻는다.

$ sudo -i -u postgres
$ createuser --interactive
Enter name of role to add: dejavu
Shall the new role be a superuser? (y/n) y

명령에 대한 설명을 보려면 man 명령으로 확인할 수 있다.

$ man createuser

이제 Database를 생성해 봅시다.

postgres 계정으로 변경하고 createdb 명령으로 만들수 있습니다. dejavu라는 데이터베이스를 만들어 봅시다.

$ sudo -i -u postgres
$ createdb dejavu

postgresql에서는 데이터베이스명과 동일한 linux 유저 계정이 필요합니다.

Ubuntu에서 데이터베이스명과 동일한 계정을 만들어 봅시다.

$ sudo adduser dejavu

postgresql의 데이터베이스명postgres user명Linux 유저 계정이 동일하게 존재해야 한다.

 

이제 dejavu계정으로 dejavu 데이터베이스에 접속하려면 아래처럼 하면 됩니다.

$ sudo -u dejavu psql -d dejavu
psql (9.3.18)
Type "help" for help.

dejavu=# 

접속 후 접속정보를 확인하고 싶다면 \conninfo 명령으로 확인할 수 있다.

$ sudo -u dejavu psql -d dejavu
psql (9.3.18)
Type "help" for help.

dejavu=# \conninfo
You are connected to database "dejavu" as user "dejavu" via socket in "/var/run/postgresql" at port "5432".
dejavu=# 

이제 테이블을 만들어 봅시다.

CREATE TABLE words (
    equipId serial PRIMARY KEY,
    word varchar (50) NOT NULL,
    means varchar (250) NOT NULL,
    example varchar (1000) NULL,
    location varchar (250) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
    updateDate date
);

 equipId의 serial 타입은 자동 증가하는 숫자다. location 컬럼의 check 옵션은 해당 옵션값들 중에서만 입력될 수 있다.

데이터베이스의 테이블을 확이하는 명령은 \d이다.

dejavu=# \d
               List of relations
 Schema |       Name        |   Type   | Owner  
--------+-------------------+----------+--------
 public | words             | table    | dejavu
 public | words_equipid_seq | sequence | dejavu
(2 rows)

테이블 리스트에 words 테이블 외에 words_equipid_seq 테이블이 있고 타입으로 sequence로 되어 있다. 해당 테이블은 serial 타입이 있을 경우 자동증가에 대한 데이터를 저장하게 됨다.

타입이 table인 것만 확인하려면 \dt 명령으로 확인할 수 있다.

dejavu=# \dt
        List of relations
 Schema | Name  | Type  | Owner  
--------+-------+-------+--------
 public | words | table | dejavu
(1 row)

생성한 words 테이블에 데이터를 입력하고 출력해 보자.

INSERT INTO words (word, means, example, location, updateDate) VALUES ('simple', '간단한', 'see also simply', 'east', '2017-09-14');
INSERT INTO words (word, means, example, location, updateDate) VALUES ('difficult', '어려운', 'an unreasonable and unhelpful way.', 'west', '2017-09-14');

데이터 확인은 select 문으로 확인한다.

dejavu=# select * from words
dejavu-# ;
 equipid |   word    | means  |              example              | location | updatedate 
---------+-----------+--------+------------------------------------+----------+------------
       1 | simple    | 간단한 | see also simply                    | east     | 2017-09-14
       2 | difficult | 어려운 | an unreasonable and unhelpful way. | west     | 2017-09-14
(2 rows)

where절을 넣어서 검색할 수도 있다.

dejavu=# select * from words where word = 'simple';
 equipid |  word  | means  |    example     | location | updatedate 
---------+--------+--------+-----------------+----------+------------
       1 | simple | 간단한 | see also simply | east     | 2017-09-14
(1 row)

이제 update로 데이터를 변경해 보자.

dejavu=# update words set means = '[^디퍼런스]\n어려운' where word = 'difficult';
UPDATE 1

그리고 다시 select로 확인하면 변경된 것을 확인할 수 있다.

dejavu=# select * from words where word = 'difficult';
 equipid |   word    |        means        |              example              | location | updatedate 
---------+-----------+---------------------+------------------------------------+----------+------------
       2 | difficult | [^디퍼런스]\n어려운 | an unreasonable and unhelpful way. | west     | 2017-09-14
(1 row)

delete문으로 삭제도 해보자.

dejavu=# delete from words where word = 'simple';
DELETE 1

그리고 다시 select로 확인하면 삭제된걸 확인할 수 있다.

dejavu=# select * from words;
 equipid |   word    |        means        |              example              | location | updatedate 
---------+-----------+---------------------+------------------------------------+----------+------------
       2 | difficult | [^디퍼런스]\n어려운 | an unreasonable and unhelpful way. | west     | 2017-09-14
(1 row)

테이블에 컬럼을 추가하거나 삭제하는 것도 확인해 보자.

테이블 변경은 alter 문으로 할 수 있다. lastdate라는 컬럼을 추가하고 select 해보자.

dejavu=# alter table words add lastdate date;
ALTER TABLE
dejavu=# select * from words;
 equipid |   word    |        means        |              example              | location | updatedate | lastdate 
---------+-----------+---------------------+------------------------------------+----------+------------+----------
       2 | difficult | [^디퍼런스]\n어려운 | an unreasonable and unhelpful way. | west     | 2017-09-14 | 
(1 row)

추가할 컬럼을 삭제해 보자.

dejavu=# alter table words drop lastdate;
ALTER TABLE
dejavu=# select * from words;
 equipid |   word    |        means        |              example              | location | updatedate 
---------+-----------+---------------------+------------------------------------+----------+------------
       2 | difficult | [^디퍼런스]\n어려운 | an unreasonable and unhelpful way. | west     | 2017-09-14
(1 row)

이것으로 PostgreSQL 설치와 기본 사용 확인 끝.

반응형

'OS (Operating System) > Linux' 카테고리의 다른 글

Linux 메모리 확인 방법  (0) 2021.02.16
scp, sshpass 사용법, 설치(리눅스 보안)  (0) 2020.12.07
셸 스크립트 문법  (0) 2020.09.25
리눅스 셸(Shell), 환경 변수  (1) 2020.09.25
telnet, ftp 사용법  (0) 2020.09.25
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

과거 ftp를 많이 사용하던 시절, ncftp는 기존 ftp 쉘 프로그램의 한계를 극복하는 훌륭한 프로그램이었습니다. 북마크, 디렉토리 포함해서 다운로드, 업로드 등 여러가지 다양한 기능이 있었죠.

하지만, ftp의 취약점이 널리 알려진 지금은, 기업이나 학교의 경우 망 공급원(ex. KT, SKB, LGU+ 등)의 메트로스위치에서 ftp나 smb 포트를 막는 경우가 많습니다. 특히 최근 인터넷나야나 사태를 비롯하여 에레버스(Erebus), 워너크라이, 페트야 등 악성 랜섬웨어의 창궐로 보안의 중요성이 더욱 강조되고 있습니다.

scp 도 명령어에 해당 서버의 계정정보를 적기 때문에 보안에 완벽하다고는 할 수 없지만, 주고 받는 데이터는 암호화 하기 때문에 ftp나 ncftp에 비해 안전하다고 볼 수 있습니다. 그럼 scp 사용법을 알아보겠습니다.





1. 원격서버 파일 -> 로컬서버로 전송


# scp [옵션] [원격지서버계정]@[원격지서버 IP]:[원격지서버 디렉토리] 로컬서버:[디렉토리]

실제 예제를 보시면, 이해가 쉽습니다.

예를 들어 10.10.10.1 서버에 있는 /home/backup 디렉토리를 로컬 서버의 /home으로 복사하려고 할 때, 아래와 같은 형식으로 명령어를 실행하면 됩니다.

# scp -r root@10.10.10.1:/home/backup /home/
미리 로컬파일 /home으로 이동하면 . 으로 로컬 경로를 대신할 수도 있습니다.
# scp -r root@10.10.10.1:/home/backup .

파일 하나만 전송할 경우는 -r 옵션을 빼고 실행하면 됩니다.
# scp root@10.10.10.1:/home/backup/test.tar.gz /home/
# scp root@10.10.10.1:/home/backup/test.tar.gz .





2. 로컬서버 파일 -> 원격서버로 전송


# scp [옵션] 로컬서버:[디렉토리] [원격지서버계정]@[원격지서버 IP]:[원격지서버 디렉토리]

로컬서버의 파일을 원격지로 전송하기 위해서는 로컬서버와 원격지서버 정보를 바꾸면 됩니다.

# scp -r /home/ root@10.10.10.1:/home/backup 
# scp /home/backup/test.tar.gz root@10.10.10.1:/home/backup





3. scp 옵션

scp man page에는 여러 옵션이 있지만, 실제 사용하는 옵션은 몇 개 안됩니다.


     -P port  --> ssh 기본포트인 22번 외 다른 포트를 사용할 경우, 이 옵션을 사용합니다

     -p      Preserves modification times, access times, and modes from the original file.
원 파일의 속성을 그대로 유지할 경우 사용합니다.
     -r      Recursively copy entire directories.  가장 많이 사용하는 옵션입니다. 디렉토리 전체를 scp 할 때 사용합니다.





4. sshpass 설치 및 사용법(scp 자동화)


scp로 원격지 파일을 가져오거나, 보낼 때 접속계정의 비밀번호를 입력해야 합니다. crontab 등을 이용하여 scp를 자동화, 스케줄링 하려면 비밀번호 입력절차를 scp 옵션에 포함해야 합니다. 이를 위해서는 sshpass 를 사용합니다. sshpass는 CentOS 7 의 경우, 기본 패키지에 포함되어 있지 않기 때문에, 사용하기에 앞서 yum으로 설치합니다.

# yum -y install sshpass*

설치가 완료되면, 아래와 같이 scp를 실행합니다.
sshpass -p [패스워드] scp [옵션] [원격지계정]@[원격지서버]:/[경로] [로컬서버 복사할 위치]


예제: 10.10.10.1 서버, ID: root, PW: test, /tmp/1.html 을 로컬서버 /home/backup으로 복사
sshpass -p test scp -r root@10.10.10.1:/tmp/1.html /home/backup

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

셸 스크립트 작성 방법


첫 번째 줄에 사용할 셸을 명시한다. 기본적인 bash를 사용하는 경우
#!/bin/bash
두 번째 줄부터는 셸 스크립트 명령등 구문을 시작한다.
작성후 755 권한 등 실행 파일로 만들어 줘야한다.
실행하기 위해서는 디렉터리 위치에서 ./파일명.sh 로 실행한다. 현재 위치를 정하지 않으면 PATH 에 등록된 디렉터리에서 검색한다.

실행 권한을 주지 않을 경우 sh 파일이름.sh으로 명령하거나 source 파일이름.sh 혹은 . 파일이름.sh로 실행 할 수 있다.

셸 프로그래밍 문법


주석

'#'을 앞에 붙여 주석문을 작성 할 수 있다.
사용법

#!/bash/sh

# Auth : shyun

# Work : NULL

# TODO : add work 코드 작성

변수

셸에서 변수형은 문자열만 가지며 자료형 선언이 필요없다
변수명=값

연산자,피연산자 사이에는 공백이 있어선 안되며 변수명의 경우에 -을 제외한 특수문자나 숫자로 시작할 수 없다.
변수 사용의 응용

${변수명} : 변수의 값으로 치환한다.

${변수명:=값} : 변수가 null이면 값을 할당하여 저장하고, 값이 있으면 그 값을 사용한다.

${변수명:?값} : 변수가 null이 아니면 그 값을 사용하고, 없으면 error를 내면서 값을 보여준다.

${#변수명} : 변수의 문자열 길이를 반환한다.

${변수명:offset} : 변수에서 ofset만큼 삭제 후 리턴

${변수명:offset:length} : 변수에서 offset만큼 삭제 후 length만큼 리턴

 

Argument 호출변수
함수 foo(x,y) 에서 x,y를 파라미터라고 한다. 여기서 foo(3,4)호출시 3,4가 아규먼트가 된다. 셸에서 여러 호출법을 알아보자

$0 : 실행된 셸 스크립트 명

$1 : 첫 번째 아규먼트

$2 : 두 번째 아규먼트

$# : 아규먼트의 개수

$$ : 셸 스크립트의 PID

$? : 실행 뒤 return 값. 참 0 거짓 1

$- : 현재 셸 호출 시 사용한 옵션

 

셸 변수 확인과 설정

set : 셀 변수를 모두 출력하는 명령어

env : 셸 환경변수만 출력하는 명령어

export : 변수의 범위를 환경 데이터 공간으로하여 자식프로세스에서도 사용할 수 있게 저장 (마치 전역변수 처럼 가능)

unset : 선언된 변수 제거

 

echo 문
-e 옵션으로 escape 문자를 사용할 수 있다.

\f : Formfeed. 앞 문자열만큼 열을 밀어 이동시킴

\n : 라인 개행

\r : 캐리지 리턴. 개행후 뒷 문자만큼 앞문자를 대체하여 작성

\t : 탭 만큼 띄움

조건식

두 개체를 비교하는 조건식으로 '[' 와 ']' 사이에 공백이 필수이다.
[ 표현식 ]


문자열 비교

[ 문자열 ] : null이 아니라면 참

[ 문자열1 = 문자열2 ] : 두 문자열이 같다면 참

[ 문자열1 != 문자열2 ] : 두 문자열이 다르면 참

[ -n 문자열 ] : 문자열이 null 이 아니라면 참

[ -z string ] : 문자열이 null 이면 참

 

산술 비교

[ expr -eq expr1 ] : 두 표현식 값이 같다면 참

[ expr -ne expr1 ] : 두 표현식 값이 같지 않다면 참

[ expr -gt expr1 ] : > 이면 참

[ expr -ge expr1 ] : >= 이면 참

[ expr -lt expr1 ] : < 이면 참

[ expr -le expr1 ] : <= 이면 참

[ expr -a expr1 ] : and 의 결과 둘 다 참이면 참

[ expr -o expr1 ] : or 의 결과, 둘 중 하나가 참이면 참조건문

 

조건문

if 

타언어의 if문과 같은 조건문으로 참이라면 then 부분을 실행하고 그렇지 않으면 else 부분을 실행한다. if로 시작하여 fi로 끝난다.
if [ 조건 ]
then
   코드
else
   코드1
fi

 

case문

문자열과 일치하는 정규식을 찾아 해당하는 정규식 다음 명령어를 실행시킨다. 

오른쪽 괄호와 세미콜론은 반드시 필요하며, esac로 끝난다.

case 마지막은 *)로 해당하지 않는 모든 경우를 처리한다.

case 문자열

in

    정규식) 명령어;;

    정규식1) 명령어;;

    정규식2) 명령어;;

    *) 명령어;; 혹은 처리문

esac

 

select문

콘셸이나 Bash에만 존재하는 구문으로 나열시 사용

in의 값들이 항목으로 된 메뉴를 자동으로 생성한다. 변수에 사용자가 선택한 값을 저장한다.

select 변수 in 값, 값1...

    do

       처리문

    done

 

반복문

for 문

지정된 값 안에서 루프 수행 각 값이 변수에 담기며 마지막 값까지 실행된다.

for 변수 in 값, 값1...

    do

       처리문

    done

while 문

조건이 참일 동안 do 이하의 문장 실행

while 조건문

    do

      처리문

    done

until 문

조건이 거짓일 동안만 루프 수행 while 과 반대

until 조건문

    do

      처리문

    done

함수

함수 이름()

{

      처리문

}

 

또는

 

function 함수이름

{

    처리문

}


 

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

셸이란?


커널과 사용자간 다리 역할을 하는것. 사용자로부터 명령을 받아 해석하고 실행하는 역할.
리눅스는 본셸(sh)을 기본으로 ksh와 csh 장점을 결합한 bash를 표준으로 한다.

  • sh : 본셸(Bourne Shell) 1977년 AT&T 벨 연구소에 근무하는 스티븐 본이 개발한 유닉스 버전 7의 기본 셸
  • bash : 1989년 브라이언 폭스가 GNU 프로젝트를 위해 개발한 배시셸. 본셸을 기반으로 만들어졌다.
  • csh : C 셸 1978년 버클리 대학의 빌 조이가 개발. C 언어를 기반으로 만들어졌다. 히스토리 기능, Alias 기능, 작업 제어 등 유용한 기능들을 포함하였다.
  • tcsh : 1975년 켄 그리어가 티넥스 운영체제에 명령행 완성 기능을 반영하고 csh와 통합해서 탄생
  • ksh : 콘셸(Korn Shell) 198년 AT&T 벨 연구소에 근무하는 데이비드 콘이 개발. sh를 확장해서 만들어졌다. 작업 제어, Alias, 히스토리 기능 및 vi와 같은 명령행 편집 기능, 명령행 완성 기능 등을 제공한다.

셸 확인
echo $SHELL
셸 변경
chsh 입력 후 변경하려는 셸의 절대 경로
변경 가능한 셸 확인 chsh -l
사용자 셸 정보 확인
/etc/passwd 의 7번째 필드 내용

셸에선 0 : 참 1 : 거짓

셸 환경 설정


  • 셸 변수 : 특정한 셸에서만 적용되는 변수 '변수명=값' 으로 선언 'echo $변수명' 으로 확인
  • 환경 변수 : 약속으로 정해진 변수명을 사용하고 bash에서는 PATH, SHELL 등과 같이 대문자로 지정되어있다. env 환경변수리스트확인

환경 변수


미리 정해진 환경 변수 목록

  • HOME : 사용자 홈 디렉터리
  • PATH : 실행 파일을 찾는 디렉터리 경로
  • LANG : 셸 사용 시 기본으로 지원되는 언어
  • PWD : 현재 작업 디렉터리
  • SHELL : 사용자 로그인 셸
  • USER : 사용자 이름
  • PS1 : 프롬프트 변수
  • PS2 : 2차 프롬프트 변수
  • HISTFILE : 히스토리 파일의 절대 경로
  • HISTSIZE : 히스토리 파일에 저장되는 개수
  • HISTFILESIZE : 히스토리 파일 크기
  • HOSTNAME : 시스템 호스트명
  • TMOUT : 미사용시 로그아웃 타임
  • UID : 사용자 UID

명령어 History


history 명령어 입력시 히스토리 리스트를 출력하며 기록 리스트는 .bash_history 라는 파일에 기록된다. 명령어 '!'로 대체할 수 있다.
명령문

  • !! : 마지막에 사용한 명령어 실행
  • !n : n번째 사용한 명령 실행
  • !-n : 사용한 명령 목록에서 역으로 n번째
  • !문자열 : 최근에 사용한 명령 중 '문자열'로 시작하는 명령 실행
  • !?문자열? : 최근에 사용한 명령 중 '문자열'을 포함하고 있는 명령 실행
  • ^문자열1^문자열2 : 마지막 명령문의 '문자열1'을 '문자열2'로 대체하여 실행

그룹 명령 실행


  • : : 한 줄에 여러 명령 나열 실행, 입력 순서대로 순차 처리
  • || : 논리적 OR, 앞 명령이 성공이면 결과 출력, 실패시 뒤 명령을 실행하여 출력
  • && : 논리적 AND, 앞 명령이 성공해야 뒤 명령 실행

tee


파이프 연결 출력을 두 갈래로 나눌 때 사용되는 명령. 이것도하고 다음것도 하고
tee [option] [파일]

  • i : 인터럽트 무시
  • a : 덮어쓰지 않고 내용 뒤에 추가

ex) ll | tee test.txt |more
ll 결과를 text.txt에 쓰고 more로 화면에도 출력

산술 연산


expr 명령으로 산술 연산 가능

expr 값 연산자 값
연산자 목록 : +, -, *, /, %

* 사용시 이스케이프 문자를 사용해야한다. $[ ]를 사용하면 가독성이 좋다.
echo $[ 값 연산자 값 ]

셸 설정 파일, 디렉터리


  • /etc/profile : 모든 사용자에 적용되는 환경 변수와 시작 관련 프로그램 설정
  • ~/.bash_profile : 개인 사용자에 적용되는
  • /etc/bashrc : 모든 사용자에 적용되는 alias와 함수 설정
  • ~/.bashrc : 개인 사용자에 적용되는
  • ~/.bash_logout : 개인 사용자가 로그아웃 할 때 수행되는것 설정
  • /etc/profile.d/ : 응용 프로그램에서 시작할때 설정을 위한 스크립트가 위치하는 디렉터리

 

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

telnet

원격지 텔넷 서버에 접속하는 명령어. 요즘에는 서버 포트 점검에 많이 이용된다.

서버쪽에는 telnet-server 패키지, 클라이언트에는 telnet 패키지가 필요하다.

 

telnet (option) hostname 또는 IP 주소 (port)

default port는 23번

-l 사용자명 현재 클라이언트 계정이 아닌 다른 계정으로 접속

FTP

File Transfer Protocol 서버에 접속할 때 사용하는 클라이언트 명령어

서비스를 사용하기 위해서는 데몬을 이용해 FTP 서버를 구축한 서버에 접속해야하고 클라이언트 역시 ftp 패키지가 필요하다. 공개 FTP 서버에서 사용되는 default anonymous 계정(비밀번호)이 있다. ftp 계정도 동일

default service port로 21번을 사용하고 있으며 파일 입출력을 위해 TCP/IP 연결로 20번을 사용한다.

 

ftp hostname 또는 IP 주소

 

FTP 모드 명령어

help 또는 ? 도움말기능

ls 디렉터리 리스트 출력

put 클라이언트 파일을 서버로 업로드

get 서버 파일을 클라이언트로 다운로드

size 서버 파일의 크기 출력

mkdir 서버에 디렉터리 생성

rmdir 서버 디렉터리 제거

status FTP 서버 상태 출력

quit 서버 연결 종료

mput 로컬의 여러 파일을 동시 업로드

mget 서버 파일을 여러개 동시 다운로드

cd 디렉터리 이동

rename 서버 파일 이름 변경

chmod 서버 디렉터리 퍼미션 변경

delete 서버 파일 삭제(del 약어 가능)

mdelete 서버 파일 여러개 동시 삭제

close 현재 접속 종료

open 새로운 접속

lcd 로컬 디렉터리 변경

hash 파일의 전송 상태 #로 표시

bi 파일 전송모드를 바이너리 모드로 전환

passive FTP 전송모드를 패시브 모드로 on/off


 

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

/etc/sysconfig/network

네트워크 사용 유무 지정, 호스트명, NIS도메인명, 게이트웨이 주소, 게이트웨이 장치 파일 설정 등이 기록되는 파일

게이트웨이 주소는 이더넷 디바이스 파일 ifcig-eth0에 기록되는 경우도 있다.

 

/etc/sysconfig/network-scripts

네트워크 인터페이스 환경 설정과 관련된 파일들이 저장되는곳으로 각 디바이스 별 파일명으로 저장된다.

 

/etc/resolv.conf

시스템 DNS 서버 설정

 

/etc/hosts

IP 주소와 호스트명을 매핑시키는 파일로 Alias 설정하여 가상 도메인 설정하는 등에 이용


 

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

#기본명령어 ( sudo는 사용자가 판단한다 )


ps [옵션] 

-a(all processes) 프로세스 현황 표시(다른유저)

-u(user)           유저지향적(top 포맷)

-x                  터미널 제어 없이 프로세스 현황 보기

-e(all processes) 현재 system내에서 실행중인 모든 프로세스 정보를 출력

-f(full listing) (uid,pid,ppid,c stime,tty,time,cmd)

 

jobs

현재 백그라운드 실행중인 프로세스 보기

 

실행명령어 &

백그라운드에서 실행하기 

중지 후 bg %번호

포어그라운드에서 실행중인것을 백그라운드로 이동

 

fg %번호

백그라운드에서 포어그라운드로 옮기기

백 작업 중지하기

포어로 가져온후 중지시켜야 한다.  

service 확인

service --status-all | grep +

(+ 주 처리 실행중 - 우선순위 낮음 때문에 | grep + 를 붙이면 편리하다.)

 

service 서비스이름 stop

service 종료

 

kill % 

현재 실행중인 프로세스를 죽이는 명령어


시스템 컨트롤


서비스로서 실행 된 것을 제어하는 방법 (예 : ftpd 같은 데몬)

 

systemctl status 서비스명

서비스 상태 확인

 

systemctl [start, stop, restart] 서비스명

서비스 시작, 중지, 재시작

 

 

 

덤으로 시스템 시작시 데몬처럼 시작되게 하는 방법

/etc/rc.local 에 작성한다.



반응형

'OS (Operating System) > Linux' 카테고리의 다른 글

scp, sshpass 사용법, 설치(리눅스 보안)  (0) 2020.12.07
셸 스크립트 문법  (0) 2020.09.25
리눅스 셸(Shell), 환경 변수  (1) 2020.09.25
telnet, ftp 사용법  (0) 2020.09.25
리눅스 네트워크 관련 파일  (0) 2020.09.25
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,