■ 데몬 -  

멀티태스킹 운영체제에서 데몬 (daemon)은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로

그를 남기는 'syslogd' 처럼 보통 데몬을 뜻하는 'd'를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다. 


만약, 어떤 프로그램이 항상 실행되게 하기 위해서는 daemon을 실행시켜주면된다.


/etc/init.d/  : daemon 프로그램들이 위치한 디렉토리이다. 

이 곳에 위치한 daemon을 on/off 하기 위한 방법이 있는데 

 ex 1)  sudo service apache2 start    -- daemon 프로그램이 수행된다.  (On)

 es 2)  sudo service apache2 stop    -- daemon 프로그램을 멈춘다.     (Off)


특정 프로그램에 대하여 자동으로 실행시키고 싶은 daemon이 있다면 링크를 걸어주면된다. 

 1) cli 환경에서 

 부팅 시, 자동으로 데몬이 실행되도록하고 싶다면 

 /etc/rc3.d 라는 디렉토리에 S로시작하는 이름으로 링크를 걸어주면된다. 

ex) lrwxrwxrwx 1 root root 17 Nov 6  S02apache2 -> ../init.d/apache2

( l 은 링크를 나타냄 d는 디렉토리 )

 

마찬가지로 

2)  gui 환경에서 

부팅 시, 자동으로 데몬이 실행되도록하고 싶다면 

 /etc/rc5.d 라는 디렉토리에 S로시작하는 이름으로 링크를 걸어주면된다. 


리눅스에서도 백그라운드 작업을 할 수 있다. 

 

1.  jobs : 백그라운드 작업들의 목록을 보여준다. 

2.  해당 프로그램을 작성하던 중 다른 작업을 하고 싶을 때, 해당프로그램을 백그라운드로 보내기 위해서는 Ctrl + z 를 입력한다. 

 ※ Ctrl + z : 실행중인 프로그램을 백그라운드로 보내는 단축키이다. 이 때 이 기능을 실행하면 명령어가 일시 정지 된다. 


3. jobs 를 입력하였을 때 백그라운드 작업 목록 3개(1,2,3)가 나타났다고 가정하자. 

 이 때 + 표시가 있는 것은 가장 우서순위  - 표시는 그다음 실행될 우선순위 그리고 아무런 표시가 없는 것은 - 표시가 있는 작업 이후에 순차적으로 일어날 프로그램이라고 보면된다. 

 

4. 만약 특정 작업(2번 작업)을 다시 fore ground 에서 작업하고 싶다면?  

  - fg %2 라고 하면 두번째 작업이 실행된다.  이 때 fg 는 foreground 의 약자이다. 


5.  3번 작업을 죽이고 싶다면 ?

  - kill %3


6. ls -R 과 같은 모든 디렉터리에 포함된 파일들을 나타내는 명령어의 경우 시간이 얼마나 걸릴지 모른다. 이러한 작업을 무작정 기다리기 싫을 때 즉, 처음부터 이러한 작업을 백그라운드로 돌리기 위한 작업방법이 존재한다. 

   - & 가 명령어 뒤에 붙으면 명령어가 실행될 때 백그라운드로 실행된다. 

   - 6번과 같은 경우에는  ls - alR의 시간이 오래걸리는 작업이므로 처음부터 이 작업을 할 경우 백그라운드에서 돌리겠다는 의도의 명령어이다. 

ls - alR / > result.text 2> error.log


1. locate

 - 디렉터리를 직접 뒤지지 않는다. 

 - 데이터베이스(DB)를 뒤진다.

 - 실시간으로 동기화되지는 않는다. 

 - 특정기간까지 저장된 정보를 뒤진다. 

 - 따라서 조회를하는 수행속도가 훨씬 빠르다. 

 - locate 가 사용하는 디비공간 --> mlocate ...등이 있다.


2. find 

 - 다양한 옵션이 있으므로 특정 파일을 찾고자 할 때마다 찾아서 적용해주자.

 - 실제 디렉토리를 일일이 뒤진다. locate작업 수행속도보단 느리지만 동기화가 되어있으므로 기간에 제한받지 않고 파일을 검색할 수 있다.



3. whereis 

 - 실행파일의 위치를 알아내는 명령어이다. 

 - whereis mkdir , whereis ls 이러한 프로그램명령어들의 경우에도 실행파일이 존재하므로, 실행파일이 존재하는 모든 프로그램의 경우

 whereis로 검색이 가능하다. 




※ $PATH 

 - ls, mkdir, rm, shutdown 이러한 명령어의 경우에는 특정 파일에서만 적용되는 명령어가 아니고 범위가 전지역적인데 그러한 이유는?

 - 해당 명령어를 포함하는 경우에  그 명령어를 포함한 디렉토리가 PATH에 미리 설정되어있기 떄문이다. 

 - 필요한 경우에는  PATH 에 설정만한다면 전지역적으로 해당 명령어 및 실행파일을 사용할 수 있다. 



SDD, HDD ... (Storage) 에  프로그램들이 깔려있다. 이러한 하드웨어는 가격은 저렴하지만 용량이크고, 속도는 느린 특징을 가지고 있다.

반면, Memory의 경우 가격은 비싸지만 용량이 작고, 속도가 빠른 특징을 가지고 있다.


■ 컴퓨터의 동작원리 

 - Storage 에 저장된 프로그램을 읽어서  Memory에 적재시킨다. (이 때 실행되지 않은 프로그램들은 Storage에 저장되어 있을 뿐  Memory에 적재되지 X)

 - Memory에 올라가 실행되는 프로그램들을 Process라고 한다. 

 - 이렇게 Memory에 올라간 프로그램을 cpu가 읽어서 컴퓨터가 동작한다.

 - cpu는 Processor라고도 하는데 그 이유는 Memory에 올라간 process를 처리하므로 Proceseeor라고 한다. 

 

http://cybernetnews.com/linux-directory-structure/


http://linux.tutsgo.com/2016/07/manage-files-from-command-line-in-linux.html  


https://opentutorials.org/course/2598/14205 


를 참고하여 리눅스 디렉토리의 구조를 살펴보자.

쉘을 통해서 명령을 실행시키는 작업을 한 번에 실행할 수 있는 방법을 알아보자. 

( Shell Script 를 통해서 여러가지 자동화된 작업을 처리할 수 있다. ) 


■ 예 상황 : a.log,  b.log,  c.log ..20170501.log....이러한 log 파일들이 하루마다 생성된다고 가정하자.

이러한 로그 파일들이 생성되면  bak 이란 백업디렉터리에 저장해야하는데, 이때는 쉘스크립트를 작성하여 자동적으로 실행시키는 것이 좋다.


먼저 echo $0 을 입력하여 어떤 쉘을 사용하는지 확인해보자. 2) 에서 사용하는 shell을 언급해줘야하므로.

 1) 파일을 하나 만들고 해당 파일에 쉘 스크립트를 작성해보자. 

 2)  #!/bin/bash  : bin 밑에 bash라는 프로그램을 통해서 해석되야한다는  것을 의미한다.

 3) if  ! [ -d bak ] ;  then    -- bak이란 디렉터리가 없으면 

          mkdir bak             -- bak 디렉터리를 생성하라.

     fi                             -- if 를 거꾸로 ( END IF 와 비슷한 역할을 한다.)   

     cp *.log bak              -- log 확장자를 가진 모든 파일을 복사하여 bak 디렉터리에 붙여넣자.


 4)  파일을 저장(파일명 : backup이라고 가정) 하면 Shell Script 를 실행해보아야겠지 ? 

 5) ./backup 을 입력하여 쉘 스크립트를 실행하려하였으나 정상적으로 deny 됐다.  그럼 어떻게 해야할까?

 6) 권한을 변경해줘야한다.  chmod +x backup 을 입력하여 x 즉 excutable 실행가능한 상태로 변경해줘야한다.

 7) 이렇게 해주면 해당 쉘 스크립트를 실행시킬 수 있다. 

 


1) kernel : Hardware를 제어하는  운영체제의 핵심이다.

2) shell : 사용자가 명령을 입력하면 그 명령을 컴퓨터가 이해할 수 있도록 하는 프로그램

 

사용자는 이러한 커널을 직접적으로 제어할 수는 없다. 

그럼 사용자들은 커널을 어떻게 제어할 수 있는가 ? 

사용자들이 인지하기 쉬운, 자연어로 된 명령어를 입력하여 2) shell 이 해석하고 이 것을 커널에게 전달하여 하드웨어를 제어하는 것이다.


요약하면, 커널은 주로 하드웨어 자원(HDD, SSD, memory etc..)을 효율적으로 관리하기 위해서 필요한 요소라고 생각하면 된다. 

커널이 시스템 자원을 관리한다고 말했지만 관리가 일어나기 위해서는 어떤 명령이 실행된다던지 프로그램이 실행되어야 한다. 

그리고 보통 그런 명령의 실행은 유저의 입력에 의한 것이 대부분이다. 이 떄 유저의 입력을 어떻게 받아서 처리 할 것인지를 결정하고 도와주는 녀석이 바로 쉘이다.

ps : 현재 실행되는 프로그램의 리스트를 출력하는 명령어(프로그램)이다.

(ps :process의 약자)

ps aux : 백그라운드에서 돌고 있는 프로그램까지 모두 나타난다.

 

예 )  ps aux | grep apache 

백그라운드에서 돌고있는 프로그램까지 포함하여 'apache' 라는 문자열이 들어간 프로그램이 나타난다.


IO Redirection

: output 될 결과물의 방향을 돌리는 것이라고 생각하자.

예 1)  ls -l > result.txt  

ls -l 을 입력하여 화면에 출력할 결과물을  result.txt 파일에 작성하게 해준다.

이 때 > Standard Output의 경우, 꺾쇠 앞에는 1이 생략되어있다.  

1> 디폴트 값이 1이다. 

2> 2가 되면 Standard Error 를 의미한다.

여기서 ls 가 Unix Process 이다.  이 프로그램에 -l 인자 ( Command-line Arguments )를 넘겨주는 것으로 보면된다.


rm result.txt  로 rm 명령어를 사용하여 result.txt를 삭제해주자.

이 상태에서 다시 rm result.txt를 입력하면 에러내용이 화면에 출력된다.

이렇게 화면에 출력된 에러를 redirection 시켜줄려고 하면 

rm result.txt > error.log 이렇게 하면 될까 ?

안된다.  왜냐하면 error 의 경우에는 standard output Data가 아니기때문이다. 이 때는 꺾쇠 앞에 2를 붙여야 한다.

꺾쇠 앞 2의경우 Standard errorredirection을 의미한다. 


예 2) rm reult.txt 2> error.log로 이 상황을 해결해야한다. 


>> 꺾쇠가 두개면?????

예 3)  ls -l >> result.txt 

ls -l 을 입력하여 수행된 결과를 result.txt 파일에 덮어쓰기 한 것이 아니라,  append 하는 것이다.

덧 붙인다. 기존의 내용을 그대로 두고 !!




순차적 프로그래밍 ( 프로세싱)

 - 하나의 프로그램 결과를 > 다른 프로그램의 입력으로 ..  

 - 하나의 명령 실행결과를 > 다른 명령의 입력으로 ..

 - 하나의 process 출력을 > 다른 process의 입력으로 제공 하는 형태 


파이프 (Pipe) , 파이프라인 (Pipeline)

 - 둘 이상의 명령을 묶어 출력의 결과를 다른 프로그램의  입력으로 전환하는 기능 

 - 즉,  명령어의 표준 출력을 또다른 명령어의 표준 입력과 연결시킬 수 있다. 

 

실습 

 1. ls -l  : 해당위치에서 디렉터리 및 파일 목록을 화면에 출력해준다. 

 2. ls -l  |  grep sort  해당 위치에서 디렉터리 및 파일 목록을 화면에 출력해주는데, sort라는 문자열이 속한 행만 화면에 출력해준다. 

 3. ls -l  |  grep sort  |  grep file  해당 위치에서디렉터리 및 파일목록을 화면에 출력해주는데, sort라는 문자열이 속하면서 file이라는 문자열이 동시에 속

한 행을 화면에 출력해준다.


+ Recent posts