쿼리를 날리다 보면, 필요에 따라 그룹별로 순위를 매겨야 할 때 있다.
이에 대해 오라클에서는 그러한 기능을 제공하는데,
아래가 바로 그 예이다.

[Oracle]
SELECT empno, ename, job, sal, 
           
ROW_NUMBER() OVER(PARTITION BY job ORDER BY sal) AS rnum
FROM scott.emp;


<<결과>>

     EMPNO ENAME                JOB                       SAL       RNUM
---------- -------------------- ------------------ ---------- ----------
      7902 FORD                  ANALYST                    3000          1
      7788 SCOTT                ANALYST                   3000          2
      7369 SMITH                 CLERK                         800          1
      7900 JAMES                CLERK                         950          2
      7876 ADAMS                CLERK                       1100          3
      7934 MILLER                CLERK                       1300          4
      7782 CLARK                 MANAGER                  2450          1
      7698 BLAKE                 MANAGER                  2850          2
      7566 JONES                 MANAGER                  2975          3
      7839 KING                    PRESIDENT                5000          1
      7654 MARTIN               SALESMAN                 1250          1
      7521 WARD                  SALESMAN                 1250          2
      7844 TURNER               SALESMAN                 1500          3
      7499 ALLEN                 SALESMAN                 1600          4

14 개의 행이 선택되었습니다.



상기 쿼리는,
emp 테이블의 JOB을 기준으로 하여 그룹을 정하고 (PARTITION BY job),  -- 1
sal을 기준으로 하여 순위를 매겨(ORDER BY sal),
각각의 행에 ROW_NUMBER를 부여하겠다는 의미이다.                         -- 2


여기서 'PARTITION BY job'은 job별 정렬을 발생시킨다.
즉, 최종 결과물의 넘버링은 ORDER BY job, sal의 순으로 결과가 나오는 것이다.




[MySQL]
그런데, 불행하게도..... MySQL에는 저 기능이 없다.
그렇기 때문에 우리의 친구 꼼수(?)를 이용하여 저것을 구현해 내야 하는데.....

SELECT empno, ename, job, sal, rnum
FROM (
   SELECT a.*, 
           (CASE @vjob WHEN a.job THEN @rownum:=@rownum+1 ELSE @rownum:=1 END) rnum,
           (@vjob:=a.job) vjob
   FROM emp a, (SELECT @vjob:='', @rownum:=0 FROM DUAL) b
   ORDER BY a.job, a.sal                 
) c;


<<결과>>
+-------+--------+-----------+------+------+
| empno | ename  | job       | sal  | rnum |
+-------+--------+-----------+------+------+
|  7902 | FORD   | ANALYST   | 3000 |    1 |
|  7788 | SCOTT  | ANALYST   | 3000 |    2 |
|  7369 | SMITH  | CLERK     |  800 |    1 |
|  7900 | JAMES  | CLERK     |  950 |    2 |
|  7876 | ADAMS  | CLERK     | 1100 |    3 |
|  7934 | MILLER | CLERK     | 1300 |    4 |
|  7782 | CLARK  | MANAGER   | 2450 |    1 |
|  7698 | BLAKE  | MANAGER   | 2850 |    2 |
|  7566 | JONES  | MANAGER   | 2975 |    3 |
|  7839 | KING   | PRESIDENT | 5000 |    1 |
|  7654 | MARTIN | SALESMAN  | 1250 |    1 |
|  7521 | WARD   | SALESMAN  | 1250 |    2 |
|  7844 | TURNER | SALESMAN  | 1500 |    3 |
|  7499 | ALLEN  | SALESMAN  | 1600 |    4 |
+-------+--------+-----------+------+------+
14 rows in set (0.00 sec)

어때... 결과가 같아 보이는가?

자, 그럼 쿼리를 뜯어보자.
여기서 궁금하게 생각되는 부분은 아래 3개의 쿼리라고 예상 된다.

1. (CASE @vjob WHEN a.job THEN @rownum:=@rownum+1 ELSE @rownum:=1 END) rnum,
--> 이전 job 필드와 동일한 그룹인가를 판별하고, 그룹에 따라 순번을 부여하기 위함이며,
      테이블에서 각각의 행을 읽을 때마다,
      변수 @vjob 값이 지금 새로 읽은 job 과 같다면 변수 @rownum을 1증가 시키고, 
      그렇지 않은 경우(@vjob이 현재 읽은 job값과 같지 않다면) @rownum을 1로 초기화 시킨다
.

2. (@vjob:=a.job) as vjob
--> 테이블에서 각각의 행을 읽을 때마다,
      그룹 판별을 위해 현재 읽고 있는 행의 job값을 변수 @vjob에 입력

3. (SELECT @vjob:='', @rownum:=0 FROM DUAL) b
--> 원래는 쿼리를 수행하기 이전에, 
      SET @vjob:=0, @rownum:=0;  을 수행하여 변수를 초기화 해야 한다.
      만약 해주지 않으면, NULL 값이 들어가게 된다.

      하지만 그럴 경우 쿼리가 2번 수행되어야 하기 때문에,

      하나의 쿼리로 만들기 위해서 이런 식의 서브 쿼리를 이용한 것이다.
      이 서브쿼리는 초기 테이블 확인시 1회만 수행되고,
      이후부터는 열람되지 않는다.
    
      !! 주의 !!
      서브쿼리 안에서의 결과값만 가지고 현재의 결과값을 얻고자 할 때,
      변수가 되는 항목의 값을 동일한 자료형으로 맞춰주지 않으면, 
      정상적인 결과값이 나오지 않는다.
      가령 위의 예를 이용하자면, @vjob의 초기값을 @vjob:=0 으로 수행 하고
      서브쿼리만을 수행하면 정상적인 결과값이 나오지 않게 된다. 
      한 번 해보자~

      

이 3가지를 이해한다면 아마 이해할 수 있을 것이라 생각되지만,
한 가지 짚고 넘어가야 할 것이 있다.

Q. 우리가 흔히 쓰는 SELECT 문장의 수행순서는 어떻게 될까?
무슨의미냐 하면..
위에서 사용한 것처럼 변수를 이용한 SELECT 내 연속적인 값의 할당은,
수행결과에 영향을 미치게 되지 않을까?
라는 질문이다.


흠.. 내가 말을 써놓고 난해하군..
예제를 보도록 하자.

<<예제>>
SET @val1=0, @val2=0;    #아까도 말했듯이 변수 초기화는 먼저 선행되어야 한다.
SELECT @val1:=@val1+1, @val2:=@val1+1, @val2:=0, @val1=@val2+1
FROM DUAL;


자.... 당신이 예상하는 결과는?.....



<<쿼리 수행 결과>>
 +----------------+----------------+----------+---------------+
| @val1:=@val1+1 | @val2:=@val1+1 | @val2:=0 | @val1=@val2+1 |
+----------------+----------------+----------+---------------+
|                      1 |                     2 |             0 |                    1 |
+----------------+----------------+----------+---------------+
1 row in set (0.00 sec)

상기와 같이 SELECT 내 수행 결과는,
왼쪽에서 오른쪽으로 순차적인 수행이 이루어짐을 알 수 있다.

즉, @val1:=@val1+1  @val2:=@val1+1  @val2:=0  →  @val1=@val2+1
로 수행 순서가 정해진다는 의미.

그러므로,
변수를 이용한 SELECT를 이용할 때는 반드시 수행순서를 염두해 두고 쿼리를 작성하도록 하자.




PS : 오라클에는 예제 테이블이 있지만 MySQL 에는 없으니
       혹시 테스트 해보고 싶은 사람은 아래 쿼리를 수행해서 테스트 해보도록...

CREATE TABLE emp (
   empno INT,
   ename VARCHAR(30),
   job VARCHAR(30),
   sal INT
)ENGINE=INNODB DEFAULT CHAR SET=UTF8;

INSERT INTO emp
VALUES
(7902,'FORD','ANALYST',3000),
(7788,'SCOTT','ANALYST',3000),
(7369,'SMITH','CLERK',800),
(7900,'JAMES','CLERK',950),
(7876,'ADAMS','CLERK',1100),
(7934,'MILLER','CLERK',1300),
(7782,'CLARK','MANAGER',2450),
(7698,'BLAKE','MANAGER',2850),
(7566,'JONES','MANAGER',2975),
(7839,'KING','PRESIDENT',5000),
(7654,'MARTIN','SALESMAN',1250),
(7521,'WARD','SALESMAN',1250),
(7844,'TURNER','SALESMAN',1500),
(7499,'ALLEN','SALESMAN',1600);
Posted by 달팽이맛나
,

작업 중인 모 사이트가 갑자기 다운되는 현상이 발생했다.

원인은 MySQL DB connect 숫가가 꽉 차서 연결이 안되서였다.(max_connections)

급하게 MySQL Daemon을 restart해서 다시 정상이 되기는 했지만 문제를 찾아야 했다.

 

DB를 확인해 보니 1천만 row 가까운 테이블이 존재했고, 별다른 인덱스가 걸려있지 않았다.

 

Slow Query Log와 해당 테이블을 사용하는 웹프로그램을 뒤져서 해당 테이블을 다른 테이블과 JOIN 하여 데이터를 추출하고 있다는 것을 알았다....


 

웹프로그램을 짜다보면...

'이 서비스가 얼마나 활성화되겠어? 조금 서비스하다가 말겠지..'

라는 안일한 생각과 게으름으로 쿼리를 대충 사용하는 경우가 종종 있다.

 

그런 경우 약간 만 동시접속자가 증가하면 서비스가 멈추는 황당한 일을 겪게 된다.

 

이번도 그런 경우였다. 그래서 정리해 본다.

 

예제 테이블 정의

* table name : T1
+------+-------------+
| id   | name        |
+------+-------------+
| 1    | honggil     |
| 2    | nari        |
| 3    | abcd        |
+------+-------------+


* table name : T2
+------+-------------+
| id   | comment     |
+------+-------------+
| 1    | hohoho      |
| 2    | yo!!        |
+------+-------------+


 

1. JOIN을 생략한 JOIN

mysql> SELECT * FROM T1, T2 WHERE T1.id = T2.id
+------+-------------+-------------+
| id   | name        | comment     |
+------+-------------+-------------+
| 1    | honggil     | hohoho      |
| 2    | nari        | yo!!        |
+------+-------------+-------------+
 

JOIN한 각 테이블에 값이 모두 있는 필드 만 추출한다.

 

 

2. INNER JOIN

mysql> SELECT * FROM T1 INNER JOIN T2 ON T1.id = T2.id
+------+-------------+-------------+
| id   | name        | comment     |
+------+-------------+-------------+
| 1    | honggil     | hohoho      |
| 2    | nari        | yo!!        |
+------+-------------+-------------+
 
1번의 JOIN을 생략하고 Where 절로 처리한 것과 같은 결과를 보인다.

 

3. LEFT JOIN

mysql> SELECT * FROM T1 LEFT JOIN T2 ON T1.id = T2.id
+------+-------------+-------------+
| id   | name        | comment     |
+------+-------------+-------------+
| 1    | honggil     | hohoho      |
| 2    | nari        | yo!!        |
| 3    | abcd        | NULL        |
+------+-------------+-------------+
 
JOIN의 왼쪽에 있는 테이블을 기준으로, JOIN의 오른쪽 테이블에 조건에 맞는 값이 없으면 NULL 로 표시한다.
결국 JOIN의 왼쪽 테이블의 값은 모두 표시된다.

 

4. RIGHT JOIN

mysql> SELECT * FROM T1 RIGHT JOIN T2 ON T1.id = T2.id
+------+-------------+-------------+
| id   | name        | comment     |
+------+-------------+-------------+
| 1    | honggil     | hohoho      |
| 2    | nari        | yo!!        |
+------+-------------+-------------+
 
LEFT JOIN의 반대.
즉, JOIN의 오른쪽에 있는 테이블을 기준으로, JOIN의 왼쪽 테이블에 조건에 맞는 값이 없으면 NULL 로 표시한다.
결국 JOIN의 오른쪽 테이블의 값은 모두 표시된다.

이 밖에 여러가지 JOIN이 있지만 생략한다.


JOIN을 하면 간편하긴 하지만 Slow Query의 원인이 되는 경우가 많다.
어떤 쿼리가 Slow Query인지 찾기 위해 로그를 쌓는 방법을 알아보자.

1. 데몬을 실행시킬 때 Slow Query Log를 적용하는 방법
MySQL 데몬 실행 시 --log-slow-queries=[저장할파일명] 라는 옵션을 준다. [저장할파일명]은 원하는 위치의 파일명을 입력하면 된다.

/etc/init.d/mysqld 파일의  'start' 에서 아래 부분을 찾아 옵션을 추가한 후 서버를 restart하면 된다.

$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file --log-slow-queries=slow_query.log  >/dev/null 2>&1 &


2. 설정 파일에 Slow Query Log를 적용하는 방법
my.cnf 파일에 설정사항을 입력할 수가 있다.
일반적으로 my.cnf 파일은 /etc 아래에 존재한다.
아래의 내용을 적당한 위치에 기재하고 서버를 restart하면 된다.

long_query_time = 3   # 3초 이상 시간이 걸리는 Query
log-slow-queries=[저장할파일명]


[저장할파일명]은 텍스트로 저장되므로 아무 에디터에서나 열수 있고, 쌓이는 내용은 어렵지 않으므로 쉽게 알 수 있을 것이다.
Posted by 달팽이맛나
,


date_add와 date_sub의 종류는

 second - 초를 추가 합니다(interval 1 second)

minute - 분을 추가 합니다.(interval 1 minute)
hour - 시간을 추가 합니다.(interval 1 hour)
day - 일을 추가 합니다.(interval 1 day)
month - 달을 추가 합니다. .(interval 1 month)
year - 년을 추가 합니다. .(interval 1 year)
minute_second - 분과 초를 추가 합니다. (interval "1:1" minute_second)
hour_minute - 시간과 분을 추가 합니다. (interval "1:1" hour_minute)
day_hour - 일과 시간을 추가 합니다. (interval "1 1" day_hour)
year_month - 년과 월을 추가 합니다. (interval "1-1" year_month)
hour_second - 시간과 분, 초를 추가 합니다. (interval "1:1:1" hour_second)
day_minute - 일과 시간, 분을 추가 합니다.(interval "1 1:1" day_minute)
day_second - 일과 시간, 분, 초를 추가 합니다.(interval "1 1:1:1" day_second)

Posted by 달팽이맛나
,

[JavaScript] URL 알아내기

2009. 9. 8. 14:55

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


wget 사용법

* 이 글은 유닉스 관련 운영체제의 경험이 별로 없는 사람을 위한 wget 의 간단한 지침서입니다.

1. wget ?

코맨드 라인에서 파일 다운로드를 쉽게 할 수 있는 유틸리티이다. 요즘의 대부분의 리눅스 배포판에는 기본적으로 설치되어 있다.

2. Windows 버전의 wget

* win32 에서 사용가능한 바이너리도 존재한다. 여기를 참조.

- 위의 바이너리를 다운로드하고 윈도우 환경변수에서 PATH에 잡혀 있는 폴더로 복사해 둔다.
- "어떻게 윈도우에서 PATH를 잡나요?" 라고 생각하시는 분이라면 여기를 참조할 것.
- "PATH가 뭐지요?" 라고 생각하는 분이라면 걍 C:Windows 폴더로 복사한다. -.-;;;

3. 기본적인 사용법
 
- PATH가 걸린 상태에서 '명령 프롬프트' 를 부르고 'wget' 을 입력한다.
* 보다 명령 프롬프트를 쉽게 사용하려면 여기를 참조.

- "wget --help" 라고 하면 사용할 수 있는 옵션이 출력된다.


4. 중요한 옵션 및 사용예
 
- r : 지정된 디렉토리의 하위 디렉토리의 내용을 몽땅 다운로드한다.

사용예 : wget -r ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 
설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 의 디렉토리 구조를 유지한 채로 모든 파일을 불러온다.

- nd : 디렉토리를 만들지 않는다. 계층적으로 나열된 웹 사이트의 디렉토리의 내용을 한 디렉토리로 불러올 때 편리하다. -r 옵션과 같이 사용하면 매우 유용하다.

사용예 : wget -nd -r ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 
설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/blast/db/  내의 내용물을 현재 폴더에 몽땅 다운로드받는다.

-A, --accept=: 지정된 확장자의 파일만을 받아온다.

사용예 : wget -nd -r --accept=fna ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/

설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria 에서 확장자가 .fna 인 파일만을 받아서 현재 디렉토리에 저장한다. (물론 -nd 옵션을 빼면 폴더 구조가 그대로 유지된다)


-R, --reject=: 지정된 확장자의 파일만을 빼고 받아온다.

사용예 : wget -nd -r --accept=fna ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/

설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria 에서 확장자가 .fna 인 파일만 빼고 받아서 현재 디렉토리에 저장한다.

-l , --level= : -r 옵션, 즉 하위 디렉토리 받아오기를 사용하였을 때 다운로드받을 최대 단계를 지정할 때 사용한다.

사용예 : wget -nd -r --accept=fna --level=3 ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/ 
설명 : ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria 에서 확장자가 .fna 인 파일만 빼고 받고 3단계까지 거슬러 올라서 다운로드를 수행한다.

-N : 현재 다운로드 받을 위치에 있는 파일이 현재 내 하드에 있는 파일보다 새로운 파일일때만 다운로드를 수행한다

-m : 미러 명령. 즉, 특정한 웹사이트의 내용을 그대로 폴더 구조채 긁어오되, 새로 업데이트한 내용만을 다운받고 싶을 때 사용한다.

ftp id, password 지정 : wget ftp://id:password@website



이런 식으로 id와 password를 지정하면 된다

이 정도면 많이 사용하는 옵션에 대해서는 설명했을 것이다. 기타 명령어에 대해서는 wget --help 를 입력하면 자세한 설명이 나와 있다.


5. 기타
 
- 쉘 스크립트나 배치 파일을 이용하여 자동화하면 매우 편리하다.

가령 유닉스 계열이라면

#!/bin/bash
wget -nd -r ftp://id:password@website/$1/


과 같은 식으로 간단한 쉘 스크립트를 작성하여 적당한 이름으로 저장한 후, Path가 걸린 위치에 넣고 실행 권한 (chmod +x <파일이름>) 을 주면 매우 편리하다.

윈도우라면

echo off
wget -nd -r  ftp://id:password@website/%1/


과 같은 식으로 배치 파일을 만들고 *.bat 으로 저장한다.

- 도스 시절부터 PC를 이용해 온 사람이라면 배치 파일에 대해서 잘 알고 있겠지만, 그렇지 않은 사람은 여기 를 참조해 보기를. 사실 유닉스 계열의 쉘 스크립트만큼 강력하지는 않고,윈도우 자체가 GUI 환경 위주의 운영체계이긴 하지만 그래도 어느 정도 수준의 일은 윈도우에서도 처리 가능하다. 사실 Win98 같은 구닥다리 말고 NT 계열의 운영체제 (NT, 2000, XP) 는 결코 널럴하게 만들어진 운영 체제는 아니다. 아마도  NT 계열 MS 운영체제가 유닉스 계열에 대해서 가지는 가장 큰 약점은 '유저의 평균수준' 일지도 모른다. -.-;;
Posted by 달팽이맛나
,

1단계 : 전원스위치 ON
- 시스템 전원공급
- 메인보드의 ROM-BIOS에 있는 BIOS프로그램 자동실행.
 BIOS프로그램은 전원공급과 함께 메모리의 특정번지(예:FFFF0H)에 자동 로드됨
 CPU는 전원공급과 함께 특정번지(예:FFFF0H)의 BIOS프로그램(명령들)을 자동실행함.

2단계 : BIOS프로그램들의 실행내용들
- 자체진단기능(POST-Power On Self Test)
CMOS검사, CPU, MEMORY, 그래픽카드, 키보드, 마우스등 각종 장치들의
이상유무를 검사하고 이들 장치(하드웨어들)을 초기화시킴
- 부팅매체검색과 부트로더(Grub) 실행
POST과정이 이상없이 진행완료되면 검색된 부팅매체
(하드디스크, CD-ROM, 플로피디스크등)에서 부트로더(예:GRUB, LILO)를 불러들임.
즉, 예를들어 하드디스크가 부팅매체로 선택되었다면 하드디스크의 부팅파티션에 있
는 0번섹터 (대부분 MBR이라고도 함)에 있는 부트로더(Boot Loader, 즉, GRUB)을 읽
어들이게 됨.
부트로더(GRUB)가 메모리에 적재되면 BIOS는 종료되고, 시스템제어권은 부트로더
(GRUB)이 갖게됨

 
3단계 : 부트로더(GRUB)의 실행
- GRUB은 실행과 함께 /boot/grub/grub.conf파일을 읽어서 어떤 부팅메뉴(커널)로 부팅을 할 것인가를
 결정하게 됨(자동결정 또는 사용자선택) 이 화면이 GRUB이 화면(파란화면)에 나타나는 첫번째 화면임.

- GRUB은 커널(kernel)이미지를 불러들임. 그리고 시스템 제어권을 커널에게 넘겨줌.


4단계 : 커널의 로딩
- 커널은 swapper프로세스(PID 0번)를 호출함.
- swapper는 커널이 사용할 각 장치드라이브들을 초기화하고 init프로세스(PID 1번)를 실행하게 됨.
- init프로세스가 실행되면서 /etc/inittab파일을 읽어들여서 그 내용들을 차례대로 실행함.


5단계 : init프로세스의 실행(부팅과정의 70-80%)
- 이후의 과정들은 모두 init프로세스의 실행내용들임. (/etc/inittab파일의 실행내용들)
- 즉, 로그인프롬프트가 나오기 까지의 부팅완료화면까지 init프로세스에 의해서 실행되는내용들임.

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)

id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

x:5:once:/etc/X11/prefdm –nodaemon

name : level-number : options : process -options
name : 각항목(행)의 이름들 (id, si, pr, pf, ca등)
level-number : 해당행의 설정내용을 어떤 부팅레벨에서 실행할 것인가를 설정
options : 다음에 오는 process를 실행할 때 적용할 프로세스 속성(옵션)
respawn, wait, once, off, initdefault, sysinit, powerfail, powerokwait, ctrlaltdel등
process –options : 실행할 실제 내용(명령어)
예)
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now



Posted by 달팽이맛나
,

1. cron 시스템이란?
- 특정 작업을 정해진 시간에 주기적이고 반복적으로 실행하기 위한 데몬과 그 설정들
- cron시스템에는 시스템에서 기본적으로 사용하는 cron설정이 있으며, 이를 시스템크론이라고 함.
- cron시스템에는 root나 일반사용자가 자신의 cron설정을 직접하여 사용하는 사용자크론이 있음.


* cron에 관한 데몬과 파일들

- cron데몬파일                       :   /usr/sbin/crond *직접실행도 가능
- cron데몬의 시작/종료/재시작 :   /etc/rc.d/init.d/crond start/stop/restart
- crond 실행확인                    :   ps –ef | grep crond
- cron설정파일                       :   /etc/crontab
- 시스템크론 설정디렉토리       :   /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly
- 사용자크론 설정파일             :   /var/spool/cron/* (사용자계정명과 동일한 파일명으로 존재함.)
- 사용자크론설정 명령어          :   /usr/bin/crontab
- cron실행내용 기록되는 로그파일 :   /var/log/cron

*참고 : atd에 의한 수행내역은 /var/log/messages에 기록됨.



2. cron 시스템의 실행 흐름도

전원ON ->
init 데몬 ->
crond 데몬실행 ->
ㅇ /etc/crontab 파일을 읽어들임
- /etc/cron.hourly : 매시마다 수행될 내용들 수행함.
- /etc/cron.daily : 매일 1회 수행될 내용들 수행함.
- /etc/cron.weekly : 매주 1회 수행될 내용들 수행함.
- /etc/cron.monthly : 매월 1회 수행될 내용들 수행함.

ㅇ /var/spool/cron 디렉토리에 있는 파일들을 읽어들임
- 각 사용자들의 개별 cron설정파일들을 읽어들여 설정된 내용을 각 주기에 맞게 수행함.
ㅇ cron에 의해 수행되지 못한 작업 anacron에 의해 수행 시도함.
ㅇ cron 로그파일에 실행기록 : /var/log/cron
- crond에 의해 수행된 수행내용 기록
- anacron에 의해 수행된 수행내용 기록
* atd에 의한 수행기록은 /var/log/messages에 기록

3. cron 시스템 살펴보기

 
4. cron의 실행주기 설정형식과 방법

 첫번째  분. 0~59분
 두번째  시. 0~23시
 세번째  일.1~31일
 네번째  월.1~12월
 다섯번째  요일.1:월, 2:화~7,0:일요일
 여섯번째  실행할 명렁어
"*" : 모든 숫자
"-" : 기간(1-12)
"," : 가각의 숫자 (5,7,9)

crontab -l 설정 목록 (= cat /var/spool/cron/root)
crontab -e 설정 수정 vi에디터로 실행 -> /var/spool/cron/root 파일을 연 것이다.

5. 시스템 cron 이해와 활용
설치 기본값으로 시스템에 설정된 cron
ls -l /etc/cron.hourly/
ls -l /etc/cron.daily/
ls -l /etc/cron.weekly/
ls -l /etc/cron.monthly/
6. 사용자 cron 이해와 활용
ㅇ 사용자 cron 의미
- 개별 사용자가 자신의 cron설정을 개별적으로 할 수 있음.
- 개별 사용자의 cron설정파일은 /var/spool/cron 디렉토리내에 자신의 ID와 동일한 파일로 생성됨

ㅇ 사용자 cron 설정시 사용명령어(crontab)
- 개별사용자의 cron설정 방법 : crontab –e
- 개별사용자의 cron설정 확인 방법 : crontab –l
- 개별사용자의 cron설정 삭제 방법 : crontab –r
- root의 일반사용자 cron설정 방법 : crontab –u 사용자명 –e
- root의 일반사용자 cron설정 확인 방법 : crontab –u 사용자명 –l
- root의 일반사용자 cron설정 삭제 방법 : crontab –u 사용자 -r

ㅇ cron 사용허가(불허가) 설정파일
- /etc/cron.allow 파일 : 이 파일에 등록된 사용자는 crontab으로 cron설정가능함.
- /etc/cron.deny 파일 : 이 파일에 등록된 사용자는 crontab으로 cron설정 불가능함

- 설치초기 값으로는 이 두 파일은 존재하지 않음. 따라서 필요시 생성해야 함.
- 설정방법은 한 행에 하나의 ID씩 기재하면 됨.
- 두 파일이 모두 존재하지 않으면 root만 가능.
- 만약 /etc/cron.allow파일을 만들었다면 root라도 이 파일에 root를 등록해야 사용 가능함.

7. 활용 1: 자동백업 설정하는 cron설정하기

8. at 예약작업 스케줄링 활용
  일회성 작업

9. at 예약작업 스케줄링의 실제 작업예

Posted by 달팽이맛나
,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

 function keyCheck(){
        alert(event.keyCode);
}
<input type="text" keydown="keyCheck">


코드 코드 코드 코드 코드 코드
←(백스패이스) 8 스페이스 32 0 48 A 65 윈도우(왼쪽) 91 F1 112
TAB 9 PAGEUP 33 1 49 B 66 윈도우(오른쪽) 92 F2 113
ENTER 13 PAGEDN 34 2 50 C 67 기능키 93 F3 114
SHIFT 16 END 35 3 51 D 68 0(오른쪽) 96 F4 115
CTRL 17 HOME 36 4 52 E 69 1(오른쪽) 97 F5 116
ALT 18 ←(중간) 37 5 53 F 70 2(오른쪽) 98 F6 117
PAUSEBREAK 19 ↑(중간) 38 6 54 G 71 3(오른쪽) 99 F7 118
CAPSLOOK 20 →(중간) 39 7 55 H 72 4(오른쪽) 100 F8 119
한/영 21 ↓(중간) 40 8 56 I 73 5(오른쪽) 101 F9 120
한자 25 INSERT 45 9 57 J 74 6(오른쪽) 102 F10 121
ESC 27 DELETE 46     K 75 7(오른쪽) 103 F11 122
    NUMLOCK 144     L 76 8(오른쪽) 104 F12 123
    SCROLLLOCK 145     M 77 9(오른쪽) 105    
            N 78 .(오른쪽) 110    
            O 79 /(오른쪽) 111    
            P 80 *(오른쪽) 106    
            Q 81 +(오른쪽) 107    
            R 82 -(오른쪽) 109    
            S 83 -(중간) 189    
            T 84 `(왼쪽콤마) 192    
            U 85 (중간) 220    
            V 86        
            W 87        
            X 88        
            Y 89        
            Z 90        

Posted by 달팽이맛나
,