[MySQL] Incorrect usage of UNION and ORDER BY

Posted at 2008/11/30 15:29 // in 데이터베이스™/MySQL // by 블루비

UNION 명령의 일반적인 MySQL 오류
Incorrect usage of UNION and ORDER BY

이 문제를 해결하기 위해서는 select 문을 괄호(parenthesis) 로 감싸주어야 합니다.

(SELECT col1,col2,col3 FROM table1)
UNION
(SELECT cola,colb,colc FROM table2)

2008/11/30 15:29 2008/11/30 15:29

댓글을 남겨주세요.

[로그인][오픈아이디란?]

MySQL max connections 설정

Posted at 2008/09/25 14:00 // in 데이터베이스™/MySQL // by 블루비

Max connections 에러가 발생하면 PHP페이지에 Too many connection가 나옵니다.
이는 mysql에서 동시열결가능한 클라이언트수를 넘었기 때문이다.

MySQL 서버는 동시에 연결될 수 있는 클라이언트의 수가 기본으로 100 명이다.
동시접속자수를 변경하려면 my.cnf을 수정하고 MySQL 서버를 재시작하면 된다.

이런에러의 원인으로는 다음과 같습니다.

1) mysql_connect()함수로 DB connect를 했다면 해당스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지않아도 자동으로 연결이 종료된다.

하지만, mysql_pconnect()함수는 해당스크립트가 종료된후 mysql_close()함수가 호출되었더라도 연결이 끊어지지않은채로 계속 연결을 유지하고 있어서 금방 커넥션을 다채울수도 있다.

2) MySQL 의 메뉴얼을 보면 mysql_connect()함수를 사용하면 해당스크립트의 종료와 함께 연결이 종료된다고 되어있지만 ./mysqladmin -u -p processlist라는 명령어를 통해서 살펴보면 그대로 살아 있음을 알수 있다.

맨위에서 살펴보았던 mysqladmin -u -p variables의 결과로서 볼수 있는 여러가지 시작옵션들중 wait_timeout 의 값만큼 서버에 그대로 연결을 유지한채로 남아 있는 것이다.

따라서, 이것이 too many connections의 직접적인 이유인 것이다.


[콘솔에서 커넥션수 알아내기]
$ mysqladmin -u root -p variables | grep max_connection

| max_connections | 100

[mysql에서 커넥션수 알아내기]

show variables like '%max%';


이제는, 클라이언트의 동시 접속자를 늘리는 명령이다.
먼저 mysql을 데몬을 kill 합니다.다시 아래와같이 서버를 재가동한다.


#mysqld_safe --language=korean --datadir=/data --user=mysql --default-character-set=euc_kr -O max_connections=256 -O table_cache=128 -O wait_timeout=60 &

#mysqld_safe -O max_connections=256 -O table_cache=128 -O wait_timeout=60 &

참고로, 리눅스나 솔라리스 계열에서는 클라이언트의 동시 접속자수가 500 ~ 1,000 까지 가능하다고 합니다.하지만 1000 설정 하려고 해도 4way cpu에 상당히 많은 램이 필요하다고 할고 있다.
256이 적당하다.


여기서 max_connections 는 mysql 에 접속 할 수 있는 최대 사용자를 가르키며...
wait_timeout 은 접속 후 연결을 지속시키는 시간을 말한다


이렇게 하신 후 다시 확인한다.


[콘솔에서]

$ mysqladmin -u root -p variables | grep max_connection
$ mysqladmin -u root -p variables | grep wait_timeout

[mysql에서]

mysql> show variables like '%max_connection%';
mysql> show variables like 'wait_timeout';

[커넥션 확인]

mysql> show full processlist

[출처] mysql-too many connection|작성자 요루짱


MySQL 설정 파일(my.cnf or my.ini) 에 직접 추가 한 다음 재실행을 하셔도 적용이 됩니다.

[mysqld]
max_connections = 256
table_cache = 128
wait_timeout = 60







2008/09/25 14:00 2008/09/25 14:00

댓글을 남겨주세요.

[로그인][오픈아이디란?]

MySQL my.conf 설정 character set

Posted at 2008/08/07 16:51 // in 데이터베이스™/MySQL // by 블루비

우분투 서버의 경우 mysql 원격 접속을 하기 위해서
/etc/mysql/my.cnf 파일의 bind-address 부분은 주석처리해준다

#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#


우분투를 설치시 mysql character set 은 latin1 으로 되어 있기 때문에 my.cnf 파일에

다음 항목을 추가 하거나 수정해준다. 빨간 부분은 추가된 부분, 파란색 부분은 수정한 부분

----------------------------------------------------------
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = euckr

[mysqld]
language = /usr/share/mysql/korean

character-set-client-handshake=FALSE
init_connect="SET collation_connection = euckr_korean_ci"
init_connect="SET NAMES euckr"

default-character-set = euckr
character-set-server = euckr
collation-server = euckr_korean_ci

[mysqldump]
default-character-set = euckr

[mysql]
default-character-set = euckr
-----------------------------------------------







2008/08/07 16:51 2008/08/07 16:51

댓글을 남겨주세요.

[로그인][오픈아이디란?]

[MySQL] 데이터베이스, 테이블 Character 변경

Posted at 2008/03/18 10:12 // in 데이터베이스™/MySQL // by 블루비
데이터 베이스와 테이블의 Character set 이 맞지 않는 경우에도 한글이 깨짐 현상이 일어 나는데,
이문제를 위해서 데이터 베이스와 테이블의 Character set 동일하게 세트해줘야 합니다.










데이터베이스 Character 변경
mysql> ALTER DATABASE [Database] DEFAULT CHARACTER SET utf8;

테이블 Character 변경

mysql> ALTER TABLE [Table] DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;





2008/03/18 10:12 2008/03/18 10:12

댓글을 남겨주세요.

[로그인][오픈아이디란?]

[MySQL] root 비밀번호 분실시 해결법

Posted at 2008/02/29 12:01 // in 데이터베이스™/MySQL // by 블루비
MySQL root 비밀번호 분실시 권한 없이 MySQlL 에 접속하여 새로운 비번을 부여후 다시 MySQL을 가동하면 해결됩니다.

# cd /usr/local/mysql/bin //mysql이 설치된 디렉토리의 bin
# killall mysqld
# ./safe_mysqld --skip-grant &
# mysql
mysql> use mysql;
mysql> update user set password=PASSWORD('패스워드') where user='root';
mysql> flush privileges;
mysql> quit;
# killall mysqld
# ./safe_mysqld -uroot &

2008/02/29 12:01 2008/02/29 12:01

댓글을 남겨주세요.

[로그인][오픈아이디란?]

썬(sun.com), MySQL 인수

Posted at 2008/02/28 13:27 // in 데이터베이스™/MySQL // by 블루비
썬(sun.com) 인 MySQL을 인수 했다는 기사가 나왔군요.
갑작스런 소식인지라 향후 MySQL 행보가 어떨지.

오는 28일 http://www.sun.com/MySQL/download 에서
다운로드 서비스를 받을 수 있다고 합니다.

http://mysql.com
사이트에 들어가 보니 역시 로고가 바뀌었군요.. ㅎㅎ

사용자 삽입 이미지




2008/02/28 13:27 2008/02/28 13:27
  1. 체리필터

    2008/02/28 13:51 [수정/삭제] [답글]

    이미 좀 된 소식으로 알고 있습니다. ^^

    • 블루비

      2008/02/28 14:24 [수정/삭제]

      전 부터 인수관련 기사들이 나오긴했었나 보네요..
      인수관련 기사를 접해 보지 못한터라.... ^^

      오늘 인수완료 되었다는 기사가 나왔다길래.. ㅎㅎ

댓글을 남겨주세요.

[로그인][오픈아이디란?]

MySQL Data Type 정리

Posted at 2008/01/31 20:04 // in 데이터베이스™/MySQL // by 블루비

Integer Type

- TINYINT 128부터 127 까지의 정수형 타입, 부호가 없는 정수 0∼255까지 지원
- SMALLINT 32768부터 32767 까지의 정수형 타입, 부호가 없는 정수 0∼65535까지 지원
- MEDIUMINT 8388608부터 8388607 까지의 정수형 타입, 부호가 없는 정수 0∼16777215까지 지원
- INT 또는 INTEGER -2147483648부터 2147483647까지의 정수형 타입,
부호 없는 정수 0∼4294967295까지 지원
- BIGINT 9223372036854775808 부터 9223372036854775807 까지의 정수형 타입
부호 없는 정수 0∼18446744073709551615까지 지원
- FLOAT(M,D) 단정도 부동 소수점 실수, -3.402823466E+38 ∼ -1.175494351E-38
그리고 1.175494351E-38 ~ 3.402823466E+38까지 M은 숫자 전체의 길이, D는 소수점 자리수를 의미
- DOUBLE(M,D) 2 배 정밀도를 가진 부동 소수점 실수, -1.79769313486231517E+308 ∼ 2.22507385850720E+308


Stirng Type

-CHAR(m) 0~255까지 입력이 가능하며, 길이가 m길이만큼 고정 사이즈가 된다.
-
VARCHAR (m)0~255까지 입력은 가능하지만, 길이는 고정이 아닌 가변 사이즈이다.
-
BINARY(m) 이진 데이터를 바이트 지정한 만큼 고정 길이
-
VARBINARY(m) 이전 데이터를 바이트 지정한 만큼 넣는다. 가벼 길이
-TINYBLOB 이전 데이터를 최대 255자까지 입력이 가능하다
-
BLOB 최대 길이가 63535인 문자를 저장
-
TEXT 최대 길이가 63535인 문자를 저장
-MEDIUMBLOB 최대 길이가 16777215인 문자를 저장
-LONGBLOB 최대 입력이 4G 이진데이타, 최대 2^32 바이트
-
LONGTEXT 최대 입력이 4G 1바이트 문자열, 최대 2^32 자

/* Point */
- BLOB타입은 대소문자를 구분하고 TEXT타입은 대소문자를 구분하지 않는점이 틀림
- MySQL 3.23.2이번 버전에서는 BLOB와 TEXT컬럼에는 인덱스를 만들수 없다
- BLOB와 TEXT컬럼의 저장시에 문자열 됫부분의 공백이 제거되지 않는다.
- BLOB와 TEXT컬럼은 DEFAULT를 지정할 수 없다.


Data Type

-DATE 날짜를 표현하는 유형 [YYYY-MM-DD], 1000-01-01 ∼ 9999-12-31까지 나타낼 수 있다
-DATETIME 날짜와 시간을 표현하는 유형 [YYYY-MM-DD HH:MM:SS], 1000-01-01 00:00:00 ∼ 9999-12-31 23:59:59
-TIMESTAMP 자동변경 컬럼 타입(4 Byte ), 1970-01-01 00:00:00부터 2037년 까지 표현
-TIME 시간을 표현하는 유형 [HH:MM:SS], 839:59:59 ∼ 833:59:59 까지 표현
-
YEAR 년도를 표현하는 유형[기본적으로 4자리로 사용], 1901년 ∼ 2155년


2008/01/31 20:04 2008/01/31 20:04

댓글을 남겨주세요.

[로그인][오픈아이디란?]

How to simulate FULL OUTER JOIN in MySQL

Posted at 2008/01/31 15:46 // in 데이터베이스™/MySQL // by 블루비

출처 : http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/

In this article I’ll show several ways to emulate a FULL OUTER join on a RDBMS that doesn’t support it, as is the case with even the most recent versions of MySQL. This useful query is surprisingly tricky to get right.

Introduction

A standard SQL FULL OUTER join is like a LEFT or RIGHT join, except that it includes all rows from both tables, matching them where possible and filling in with NULLs where there is no match. I’ll illustrate that for clarity. Here are two of my favorite tables, apples and oranges:

I’ll join them on price. Here is the left join:

select * from apples as a
left outer join oranges as o on a.price = o.price

And the right join:

select * from apples as a
right outer join oranges as o on a.price = o.price

The FULL OUTER JOIN of these two tables, on price, should give the following result:

That’s the result I’ll be working toward in this article. Here is a script to create and populate the example tables, so you can follow along:

create table apples (variety char(10) not null primary key, price int not null);
create table oranges (variety char(10) not null primary key, price int not null);
insert into apples(variety, price) values('Fuji',5),('Gala',6);
insert into oranges(variety, price) values('Valencia',4),('Navel',5);

Method 1: two JOINs and a UNION

One method to simulate a full join is to take the union of two outer joins, for example,

select * from apples as a
left outer join oranges as o on a.price = o.price
union
select * from apples as a
right outer join oranges as o on a.price = o.price

This gives the desired results in this case, but it isn’t correct for all cases. Suppose there are duplicate records in the tables (remove the primary key and insert twice to create this situation). UNION eliminates duplicates, which a full join doesn’t do. UNION ALL isn’t the right answer either, because it will cause spurious duplicates. In fact, UNION generates two independent result sets and then combines them, so there is no way to get around this, because the two result sets need to “know about each other” to produce the right results.

There are legitimate cases where duplicate results are expected and correct. For instance, even when the rows are unique, selecting only certain columns, in which there are duplicates, could cause this situation. This doesn’t apply in relational theory, because a set never has duplicates no matter what, but it does in SQL.

Method 2: UNION ALL and an exclusion join

One way to make UNION include only the duplicates I want is to use an exclusion join to eliminate anything from the second result that is already included in the first, like this:

select * from apples as a
left outer join oranges as o on a.price = o.price
union all
select * from apples as a
right outer join oranges as o on a.price = o.price
where a.price is null;

This handles duplicate rows correctly and doesn’t include anything it shouldn’t. It’s necessary to use UNION ALL instead of plain UNION, which would eliminate the duplicates I want to keep. This may be significantly more efficient on large result sets, since there’s no need to sort and remove duplicates.

Method 3: use a mutex table

There’s a case where UNION won’t work: older versions of MySQL don’t support it. All is not lost, though.

I’ve written several articles explaining how to start with a set of mutually exclusive numbers (which I informally call a “mutex table“), then use the mutual exclusivity of the numbers to join things together in interesting ways. This lets me simulate subqueries and unions on earlier versions of MySQL, for example. This approach seems like it might work well here, too. For the following queries I’ll assume my mutex table has the values 0 and 1. Here’s a baseline mutex query for these two tables:

select * from mutex
left outer join apples as a on i = 0
left outer join oranges as o on i = 1;

Of course this isn’t a full join. If I want to full join on price, naturally, I need to include price in the join criteria somewhere, and the query above doesn’t even mention the price. But it’s a starting point for tinkering.

The mutex values in the leftmost column, combined with the join criteria, ensure that every row in the two tables gets included on its own row. The mutual exclusivity causes the Navel row not to be matched to the Fuji row, even though they have the same price. The correct behavior of a full join on price is to “fill in” the NULL values where the prices are equal. This modification to the join criteria will fill it in:

select * from mutex
left outer join apples as a on i = 0
left outer join oranges as o on i = 1 or a.price = o.price;

The or a.price = o.price relaxes the mutual exclusivity, telling the join to keep the rows separated unless they have the same price:

That’s getting closer. There is a spurious row, though. The Navel row at the bottom of the result set shouldn’t be there; it has already been matched to the Fuji row earlier, so there’s no need to include it with all those NULLs as though there were no matching row in apples. Can I eliminate the Navel row without eliminating the Valencia row?

That turns out to be harder to do. I stared at it for a while, thinking I could include a WHERE clause that would eliminate spurious rows based on the value of i, but after a bit I got a reality check: the row has already been included above, and WHERE clauses work a row at a time, so there’s no way to assert something about one row while applying the WHERE clause to another row. This simple fact is all I needed to realize there’s no way to eliminate the Navel row with the given information.

What I can do, though, is stack another copy of the apples table onto the right-hand side of the results thus far, matching them to the oranges values and confining them to rows with mutex value 1 instead of 0. Now I can write a WHERE clause to see if a row in the i = 1 part of the result set matches a row in the i = 0 part. I’ll write it without the WHERE clause to start:

select * from mutex
left outer join apples as a on i = 0
left outer join oranges as o on i = 1 or a.price = o.price
left outer join apples as a2 on i = 1 and a2.price = o.price;

Now there is a way to tell between the Navel row, which I don’t want, and the Valencia, which I do: the Navel has non-NULL values in the rightmost copy of apples, but the Valencia doesn’t. All I have to do is eliminate rows that have matching values:

select * from mutex
left outer join apples as a on i = 0
left outer join oranges as o on i = 1 or a.price = o.price
left outer join apples as a2 on i = 1 and a2.price = o.price
where o.price is null or a2.price is null

If the WHERE clause is hard to understand, perhaps it’s easier to think of it this way: where not(o.price is not null and a2.price is not null). Both clauses are identical; all I did was apply some boolean identities. Here is the result:

That result has the correct rows, but it has some extra columns, which I don’t need. Here’s the final query:

select a.*, o.* from mutex
left outer join apples as a on i = 0
left outer join oranges as o on i = 1 or a.price = o.price
left outer join apples as a2 on i = 1 and a2.price = o.price
where o.price is null or a2.price is null

Remember, this can’t be done without the mutex table, because I need something to provide non-NULL values for every row; otherwise the joins would not include values where the leftmost table has no rows to contribute.

This technique works if there are duplicate rows, and works on older versions of MySQL, but is probably the least efficient of the three I’ve demonstrated here. As usual, which query is appropriate depends on circumstances.

2008/01/31 15:46 2008/01/31 15:46

댓글을 남겨주세요.

[로그인][오픈아이디란?]

grant 문을 통한 mysql 사용자 추가

Posted at 2007/12/12 16:38 // in 데이터베이스™/MySQL // by 블루비
//추가
mysql>grant select, insert, delete, update, create, drop, alter on 테이타베이스명.* to 사용자아이디@localhost identified by '비밀번호';

//적용
mysql>flush privileges;



//루트 권한 부여
grant all privileges on *.* to 사용자아이디@localhost identified by '비밀번호' with grant option;
2007/12/12 16:38 2007/12/12 16:38

댓글을 남겨주세요.

[로그인][오픈아이디란?]

mysql character 확인

Posted at 2007/12/12 15:38 // in 데이터베이스™/MySQL // by 블루비
mysql> show variables like 'c%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | euckr                      |
| character_set_connection | euckr                      |
| character_set_database   | euckr                      |
| character_set_results    | euckr                      |
| character_set_server     | euckr                      |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | euckr_korean_ci            |
| collation_database       | euckr_korean_ci            |
| collation_server         | euckr_korean_ci            |
| concurrent_insert        | ON                         |
| connect_timeout          | 5                          |
+--------------------------+----------------------------+
2007/12/12 15:38 2007/12/12 15:38

댓글을 남겨주세요.

[로그인][오픈아이디란?]

[MySql] MERGE tables (2개 테이블 병합 테이블 만들기)

Posted at 2007/10/05 02:10 // in 데이터베이스™/MySQL // by 블루비
mysql> CREATE TABLE t1 (
->a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
-> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
-> a INT NOT NULL AUTO_INCREMENT,
-> message CHAR(20), INDEX(a))
-> ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

t1, t2 테이블의 데이터를 total 테이블에 병합된 데이터로 insert 하게 된다.

NSERT_METHOD는
total 테이블에 다이렉트로 INSERT할경우 UNION에
정의한 테이블중 어느 테이블에 INSERT를 할건지 정의하는것이다.(FISRT or LAST)


※ 주의할점은 두 테이블의 레코드 형식 및 타입까지 모두 일치하여야 한다.
2007/10/05 02:10 2007/10/05 02:10

댓글을 남겨주세요.

[로그인][오픈아이디란?]

mysqldump utf8 > latin1 | euckr > utf8

Posted at 2007/07/04 17:27 // in 데이터베이스™/MySQL // by 블루비
mysql charset 의 설정이 utf8 인 경우 일반 백업시에 한글이 깨지는 현상이 일어난다.
이를 해결하기 우해서 옵션을 붙여 백업을 하면 해결을 할 수 있다.


#mysql character set latin1

mysql>mysqldump -uroot -p --default-character-set=latin1 --set-charset [db name] > backup.sql
mysql>mysql -uroot -p --default-character-set=utf8 [db name] < backup.sql

#mysql character set euckr

mysql>mysqldump -uroot -p --default-character-set=euckr --set-charset [db name] > backup.sql
mysql>mysql -uroot -p --default-character-set=utf8 [db name] < backup.sql
2007/07/04 17:27 2007/07/04 17:27

댓글을 남겨주세요.

[로그인][오픈아이디란?]

리눅스 FTP 설치 - ProFTP

Posted at 2007/07/03 10:48 // in 데이터베이스™ // by 블루비
출처 : http://www.superuser.co.kr/home/lecture/index.php?cateNo=1&secNo=27&theNo=&leccode=121

서버를 설치할 때 필수로 설치되는 것이 ftp 서버입니다. 배포판과 함께 ftp서버를 설치해서 사용할 수 있지만 개인적으로 proftpd를 더 좋아합니다. 지금까지 강좌와 마찬가지로 본 강좌도 RH9를 기반으로 작성합니다. 다른 배포판 버전에도 물론 별 무리 없이 설치 될꺼리 믿어 의심하지 않습니다.~

1. 설치
모든 프로그램이 그렇듯 다운로드 받아야 합니다. proftpd는 proftpd.org에서 받으실 수 있습니다.
현재 최신버전은 1.2.9입니다. 물론 업그래이드 되더라도 설치법은 크게 변하지 않으니 최신 버전을 받아서 하셔두 됩니다.^^ 만약 설치가 안된다면, 본 강좌의 마지막 부분에 나오는 메일주소로 메일 보내 주시기 바랍니다.~

먼저 설치할 디렉토리로 이동합니다.
통상적으로 프로그램은 /usr/local 아래 디렉토리에 설치하게 되면 .. 관리가 편리합니다.. 모든 프로그램을 그 위치에 설치하고 그 디렉토리만 압축해서 보관하면 서버가 뻣었을 때 복구가 간단하죠^^:
[root@test /]# cd /usr/local/

간단하게 위와 같은 wget 프로그램을 사용하여 다운로드 받습니다.
[root@test local]# wget http://ftp.superuser.co.kr/pub/FTP/proftpd/proftpd-1.2.9.tar.gz
--11:13:51-- http://ftp.superuser.co.kr/pub/FTP/proftpd/proftpd-1.2.9.tar.gz
=> `proftpd-1.2.9.tar.gz'
Resolving ftp.superuser.co.kr... 완료.
Connecting to ftp.superuser.co.kr[210.114.223.221]:80... connected.
HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK
길이: 995,350 [application/x-tar]
100%[=================================================================>] 995,350 382.54K/s ETA 00:00
11:13:54 (382.54 KB/s) - `proftpd-1.2.9.tar.gz'가 보존되었습니다 [995350/995350]

압축을 풀어줍니다.~
[root@test local]# tar xvfz proftpd-1.2.9.tar.gz

디렉토리 이동합니다.
[root@test local]# cd proftpd-1.2.9

- 컨피그를 행합니다. 컴파일 환경과 옵션들을 설정할 수 있습니다.
./configure --help
위 명령을 내려 옵션이 뭐가 있는지 확인할 수 있지만, 별 내용없으니 아래의 옵션데로 컨피그를 합니다.
[root@test proftpd-1.2.9]# ./configure --prefix=/usr/local/proftpd --enable-autoshadow \
--enable-shadow

옵션에서 --prefix는 설치할 디렉토리이고, --enable-autoshadow와 --enable-shadow는 대부분의 Linux에 shadow패스워드 시스템을 사용하기 때문에 이렇게 적어 주었습니다.
그리구 는 한줄에 다 못쓸 때 다음줄이랑 이어진다는 의미로 적어줍니다.~ VB의 "_"와 같은 의미죠^^;

- 컴파일 합니다.
[root@test proftpd-1.2.9]# make
- 설치 합니다.
[root@test proftpd-1.2.9]# make install
2. 환경설정파일 편집
이렇게 설치를 하였다면, 환경설정 파일은 /usr/local/proftpd/etc/proftpd.conf 일 것입니다.

- 실행 그릅 변경
27번째 줄을 보면 실행그릅이 nogroup로 되어 있을 것입니다. 지금까지 설치한데로 설치 했었다면, nogroup는 없을 것입니다. nogroup라는 group를 생성해 주던지 아니면, 이 것을 nobody로 해 주면 됩니다.
Group nogroup
==> Group nobody

- wheel 그룹 사용자외에 자기 home 디렉토리 못 벗어나게 설정
다음과같이 한 줄만 추가 하면 됩니다.
DefaultRoot ~ !wheel

- 파일올렸는데 시간이 다르게 나온다면..
파일을 올렸는데 보이는 시간이 다르다면, 다음 옵션을 추가 합니다.
TimesGMT off
- 트래픽 제한 wheel 그룹 사용자만 빼고 모든 사용자에게 .. 300K/sec 로 설정하고 싶다면, 아래 설정은 30M까지는 제한이 없게 설정했습니다. 31457280 이 수치가 30M라는 의미 입니다.
TransferRate APPE,RETR,STOR,STOU 300.0:31457280 group !wheel

기타 다른 기능들을 원하신다면, 아래의 메일 주소로 메일 한통 보내 주세요~ 그럼 제가 생각해보구 제 맘데로 추가 해 두겠습니다.^^;

3. 서버 시작
모든 설정이 끝났다면, 서버(데몬)를 시작합니다.
[root@test etc]# /usr/local/proftpd/sbin/proftpd
이렇게 아무런 메시지가 없다면 시작된 것입니다.

- 확인
[root@test etc]# netstat -an | grep LISTEN | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
위와같이 21번 포트가 정상적으로 열려있어야 합니다.

[root@test etc]# ps -ef | grep proftpd
nobody 7617 1 0 11:53 ? 00:00:00 proftpd: (accepting connections)
root 7627 1682 0 11:54 pts/0 00:00:00 grep proftpd
위와같이 proftpd프로세스트 정상적으로 떠 있어야 합니다.

이렇게 확인하였다면. 서버 부팅시 시작되게 rc.local파일에 넣어줍니다.
[root@test etc]# echo /usr/local/proftpd/sbin/proftpd >> /etc/rc.d/rc.local


4. 기타 프로그램
proftpd는 여러 명령어를 제공합니다.
- ftp 서버 정지
[root@test sbin]# /usr/local/proftpd/sbin/ftpshut
usage: /usr/local/proftpd/sbin/ftpshut [ -R ] [ -l min ] [ -d min ] time [ warning-message ... ]
ftp 서버를 정지하는 명령어입니다. 접속된 사용자에게 메시지를 뿌려 줄 수 있으며, 일정시간후 자동 정지 할 수 있습니다. 개인적으로 즉시 정지 하기 위해서는 ftpshut now 라고 하면 된다는데 ... 테스트 결과 잘 되지 않는군요^;
그럴 때 이렇게 죽이세요^^:
[root@test sbin]# killall proftpd
한방에 죽습니다^^;
그리구 shutmsg가 남아있는 경우가 있습니다. 이 파일이 있으면, ftp 접속이 되지 않으니 있으면 지워 주시기 바랍니다.^^
rm -rf /etc/shutmsg

- ftp서버에 접속한 사용자 수 알아내기
[root@test bin]# /usr/local/proftpd/bin/ftpcount
Master proftpd process 7766:
Service class - 1 user

한사람의 사용자가 접속되어 있다는 것을 알 수있습니다.

- ftp 만의 top 명령이 있다^^;
[root@test bin]# /usr/local/proftpd/bin/ftptop
ftptop/0.9: Tue May 25 12:12:13 2004, up for 5 min
1 Total FTP Sessions: 0 downloading, 0 uploading, 1 idle
PID S USER CLIENT SERVER TIME COMMAND
7794 I doly test 0.0.0.0:21 257 idle

물론 top 명령어와 비슷하게 -d 옵션두 사용할 수 있습니다. 그리고 q를 누르게 되면 빠져 나오죠^^:

- ftp에서두 who 명령어를??
[root@test bin]# /usr/local/proftpd/bin/ftpwho
standalone FTP daemon [7766], up for 7 min
8240 doly [ 0m4s] 0m1s idle
Service class - 1 user

위와같이 접속 정보를 알 수 있습니다.


------------ 설치기
위의 내용데로 설치 해본 후 ftp 접속이 되질 않아 관련 자료를 찾던중..
proftpd.conf 파일에

AuthPAM off (기본값은 on입니다.)

한줄을 추가 함으로써 해결을 했다.

/var/log/message 에서 보니.
`PAM(close_session): System error`
란 에러가 뜨는걸로 봐서 아무래도 PAM 대한 문제 인듯... ㅠ.ㅠ 근데 저넘은 뭐지?

2007/07/03 10:48 2007/07/03 10:48

댓글을 남겨주세요.

[로그인][오픈아이디란?]

[리눅스 명령어] 프로세스 관련 명령어

Posted at 2007/06/30 10:47 // in 데이터베이스™ // by 블루비
출처 : 대전국제IT교육센터 정성재 강사

1. 프로세스(Process) 관리
(1) 개요 : 리눅스는 한번에 수백개이상의 프로그램을 동시 수행할 수 있다. 이러한 하나하나의
프로그램을 프로세스라 부르며 내부적으로 번호가 붙어 관리된다. 프로세스는 크게 두
가지로 나눌 수 있는데, 사용자의 입력에 관계없이 실행되는 background process와 입력
후 수행종료까지 기다리는 foreground process가 있다.
(2) 프로세스의 종류
1) 포그라운드(Foreground) 프로세스
ㄱ. 설명: 일반적으로 쉘상태에서 명령을 내리면 해당 프로세스가 종료될 때까지 기다려야 한다.
이러한 프로세스를 포그라운드 프로세스라 한다.
ㄴ. 사용예
[posein@www posein]$ find / -name '*.txt' 2>/dev/null > list.txt
=> 이 경우 find 결과가 list.txt라는 파일에 저장할 때까지 사용자는 다른 작업을 할 수
없게 된다.
2) 백그라운드(background) 프로세스
ㄱ. 설명: 기존의 포그라운드 명령뒤에 '&'를 붙인다.
ㄴ. 사용예
[posein@www posein]$ find / -type d 2>/dev/null > list.txt &
[1] 1742
=> 여기서 [1]은 작업번호(job number)이고, 1742는 PID(Process ID)이다.
(3) 작업수행의 전환
1) background --> foreground : background로 수행될 때 'fg'라고 명령을 내리면 전환된다.
2) foreground --> background : [CTRL] + [Z] (suspend 모드)를 눌러 작업을 일단 중지시킨뒤
'bg' 라고 명령을 내린다.
(참고) 인터럽트키
[CTRL] +[C] : 작업취소
[CTRL] +[D] : 작업 정상 종료
[CTRL] +[Z] : 작업 대기
(4) 현재 작업중인 process의 확인 : 'jobs'라고 명령을 내리면 된다. + 기호로 표시된 작업이 먼저
실행되는 job이고 -기호가 그다음이다.
(5) process를 중지시키기 : kill명령을 이용하여 중지, 종료 등을 할 수 있다.
1) 사용법
kill %job_number
2) 사용예
ㄱ. 작업의 중지
kill %1
=> job번호가 1인 작업을 중지 시킨다.
ㄴ. 작업의 강제종료시키기
kill -9 %1 => job번호가 1인 작업을 강제 종료시킨다.
(참고) kill 명령은 job번호와 PID(process ID)모두 사용가능하다. job번호는 앞에 %를 붙여서
구분하고 PID인 경우에는 그냥 번호만 쓴다.

2. 관련명령어
(1) ps(process status)
1) 설명: 현재 프로세스들의 상태를 PID(Process ID)와 함께 보여준다. 리눅스에서는 사용자와
파일 뿐만아니라 프로세스도 번호로 관리한다.
2) 사용법
ps [option(s)]
3) option
-a : 다른 사용자에 의해서 생성된 프로세스들도 보여준다. (u,x옵션과 연계해서 사용한다.)
-u : 프로세스의 소유자에 대한 정보 등 매우 자세하게 보여준다.
-l : 프로세스의 정보를 옆으로 길게 보여준다. (우선순위값과 관련된 PRI와 NI값을 확인할 수
있다.
-x : daemon process등 터미널의 컨트롤과 관련이 없는 프로세스도 보여준다. 일반적으로 말하
는 데몬프로세스도 보여준다. 보통 ps명령을 실행하면 현재 Shell의 자식 프로세스들만
보여주는데, 이 옵션으로 다른 프로세스들도 볼 수가 있다. (BSD계열)
System V계열인 경우에는 -x대신에 -e를 사용할 수 있고, -u 대신에 -uf옵션을 사용할 수
있다.
-e : 해당 프로세스에 관련된 환경변수 정보를 함께 출력한다.
-f : 프로세스 간의 상속관계를 보여준다.(PID, PPID값이 표시된다.)
(참고2) daemon process
daemon process란 daemon(악마)처럼 앞에 나타나지 않고 사용자가 모르게 뒤에서 시스템의 관리
를 위해 움직이는 프로세스를 말한다. 보통 시스템이 부팅이 될 때 자동적으로 실행이 된다.
ftpd, inetd, lpd, nfsd 등이 있다.
4) 사용예
ㄱ. [posein@www posein]$ ps
PID TTY TIME CMD
23563 pts/0 00:00:00 bash
23594 pts/0 00:00:00 ps
ㄴ. ps -au
=> 현재 시스템상의 process들 중 터미널과 관련이 있는 모든 process들을 소유자 정보와
함께 보여준다.
ㄷ. [posein@www posein]$ ps -aux |more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1368 548 ? S May02 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW May02 0:00 [keventd]
=> 현재 시스템상에서 움직이고 있는 모든 process들을 소유자의 정보와 함께 보여준다.
ㄹ. [posein@www posein]$ ps -ef |more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May02 ? 00:00:04 init [3]
root 2 1 0 May02 ? 00:00:00 [keventd]
=> sysV 계열에 사용하는 옵션형태로 내용은 위와 비슷하다. 참고로 ps옵션에서 BSB계열
의 -aux와 SYSTEM V계열의 -ef옵션은 거의 유사하다. 리눅스에서는 현재 이 두계열의
옵션 모두 지원한다.
ㅁ. [posein@www posein]$ ps -aux |grep sendmail
root 743 0.0 0.4 5580 2208 ? S May09 0:04 sendmail: accepti
smmsp 753 0.0 0.3 4852 1900 ? S May09 0:00 sendmail: Queue r
=> 현재 시스템상의 프로세스중 sendmail의 프로세스를 보여준다.
ㅂ. [posein@www posein]$ ps -aux |grep posein
root 27264 0.0 0.2 2216 1152 ? S 21:39 0:00 login -- posein
posein 27265 0.0 0.2 5496 1432 pts/0 S 21:39 0:00 -bash
posein 27398 0.0 0.1 2700 732 pts/0 R 21:50 0:00 ps -aux
=> 현재 시스템상의 프로세스중 posein 이라는 사용자의 프로세스를 보여준다.
5) ps상태보기
USER : BSD 계열에서 나타나는 항목으로 프로세스 소유자의 USERNAME
UID : SYSTEM V계열에서 나타나는 항목으로 포로세스 소유자의 USERNAME
PID : 프로세스의 식별번호
%CPU : CPU사용비율의 추정치(BSD)
%MEM : 메모리 사용비율의 추정치(BSD)
VSZ : K단위 또는 페이지 단위의 가상메모리 사용량
RSS : 실제 메모리 사용량. Resident Set Size
TTY : 프로세스와 연결된 터미널
STAT : 현재 프로세스의 상태
- 값
R : 실행 중 혹은 실행될 수 있는 상태
S : sleep상태 (보통 20초이상된 상태)
I : idle(비활동상태 : BSD, 중간적상태 : sysV) (보통 20초이하의 대기상태)
T : 정지된 상태(suspend)
Z : 좀비(zombie)프로세스
D : 디스크 관련 대기상태(BSD)
P : 페이지 관련 대기상태(BSD)
X : 메모리 확보를 위한 대기 상태(sysV)
K : 사용가능한 커널 프로세스(AIX)
W : 스왑 OUT된 상태
N : nice되어진 상태
> : 우선순위가 인위적으로 높아진 상태
START : 프로세스 시작 시간 또는 날짜
TIME : 총 CPU사용시간
COMMAND : 프로세스의 실행 명령행
STIME(sysV) : 프로세스가 시작된 시간 혹은 날짜
C(sysV), CP(BSD) : 짧은 기간 동안의 CPU사용률
F : 프로세스의 플래그들
PPID : 부모 프로세스의 PID
PRI : 실제 실행 우선 순위
NI : nice 우선순위 번호
WCHAN : 프로세스를 기다리고 있는 이벤트
PLAGS : 프로세스와 관련된 숫자 값

(2) kill
1) 설명: 프로세스에 특정한 signal을 보내는 명령이다. 보통 실행중인 프로세스에 종료 신호를
보낸다. 보통 중지시킬 수 없는 프로세스를 종료시킬때 많이 사용한다.
2) 사용법
kill [option] [-시그널번호 or -시그널이름] PID
=> kill 명령 뒤에 어떤 프로세스의 PID(Process ID)를 적어주면 그 프로세스에 종료시그널을
보내게 된다. 보통의 경우 종료시킬 수 있으며, 만약에 종료되지 않으면 9를 signal_number
에 써 줌으로써 강제로 종료시킬 수 있다.
kill [option] [-시그널번호 or -시그널이름] %작업번호
3) option
-l : 시그널의 종류를 나열한다. 시그널의 종류는 시그널 번호순서대로 나열한다.
4) signal_number와 이름
1 SIGHUP(HUP) : hang up의 약자로 프로세스를 재시작시키는 시그널이다.
2 SIGINT(INT) : 인터럽트. 실행을 중지시킨다. [CTRL] + [C] 를 눌렀을 때 보내지는 시그널
이다.
3 QUIT : 실행중지.
9 SIGKILL(KILL) : 무조건 종료, 즉 강제 종료시키는 시그널이다.
15 SIGTERM(TERM) : Terminate의 약자로 가능한 정상 종료시키는 시그널로 kill 명령의 기본
시그널이다.
18 CONT : Continue. STOP등에 의해 정지된 프로세스를 다시 실행시킨다.
19 STOP : 무조건적, 즉각적 정지
20 TSTP : 실행 정지후 다시 실행을 계속하기 위하여 대기시키는 시그널이다. [CTRL] +[Z] 를
눌렀을 때 보내지는 시그널이다.

5) 참고
kill -l 이라고 써주면 signal_number에 보내줄 수 있는 시그널의 종류들을 보여주며, signal_
number에 숫자 대신에 직접 이름을 써 주어도 된다. man 을 참조하려면 man 7 signal 하면 된다.
6) 사용예
ㄱ. kill -l
=> 시그널의 종류를 나열한다.
ㄴ. kill 724
=> 724번 프로세스에 디폴트시그널인 15번 시그널을 보낸다.
같은 명령으로 'kill -15 724', 'kill -TERM 724'등이 있다.
ㄷ. kill -9 756 757 758
=> pid가 756, 757,758인 프로세스를 중단한다. 'kill -KILL PID', 'kill -SIGKILL PID'
라고 명령내려도 된다.
ㄹ. kill -HUP 10118
=> pid가 10118인 프로세스를 재시작한다. 'kill -1 10118'과 같다.
ㅁ. kill %2
=> 작업번호가 2인 프로세스를 종료시킨다.
7) 프로세스 종료시 유의점
프로세스를 종료시에는 [CTRL] +[C]나 기본시그널인 TERM 시그널(-15)로 정상적으로 종료를
시도하는 것이 좋다. 그래도 프로세스가 종료가 안되면 KILL 시그널(-9)을 사용하면 된다.

(3) killall
1) 설명: 같은 데몬의 여러 프로세스를 한번에 죽이는 경우에 사용한다. Killall은 프로세스이름
으로 프로세스를 종료시킨다.
2) 사용법
killall [option] 프로세스명
3) option
-HUP : 재시작한다.
4) 사용예
ㄱ. killall httpd
=> Apache 웹서버 데몬을 모두 종료한다.
ㄴ. killall mysqld
=> mysql 데몬을 모두 종료한다.
ㄷ. killall -HUP xinetd
=> xinetd 데몬을 다시 실행시킨다.

(4) pstree
1) 설명 : 프로세스들을 계층적인 트리구조 형태로 출력해준다.
2) 사용법
pstree [option]
3) option
-a : 각 프로세스의 명령행 인자까지 보여준다.
-h : 현재 프로세스와 그것의 조상 프로세스를 하이라이트로 강조해서 보여준다.
-n : PID 값으로 정렬해서 보여준다. 기본값은 이름으로 출력한다.
-p : PID 값을 같이 보여준다.
4) 사용예
[posein@www posein]$ pstree
init-+-apmd
|-atd
|-automount
|-bdflush
|-crond---crond---run-parts---awk
|-eth0
|-eth1
|-gpm
|-httpd---10*[httpd]
=> (결과설명)
최초로 실행되는 프로세스인 init가 왼쪽 상단에 나타나며 자식 프로세스는 오른쪽에 위치
한다. 또한 프로세스앞에 n*은 실행되고 있는 프로세스의 갯수이다.

(5) top
1) 설명: 현재시스템의 프로세스 상태를 연속적으로 화면에 보여준다.
2) 사용법
top [option]
3) option
-d 갱신시간 : 화면 갱신시간을 설정
-q : 화면을 계속 갱신한다.
-i : idle상태와 zombie 프로세스를 무시한다.
4) 사용예
[root@www root]# top
1:17am up 1 day, 13:06, 3 users, load average: 0.00, 0.00, 0.00
68 processes: 66 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: 0.0% user, 0.0% system, 0.0% nice, 100.0% idle
Mem: 513064K av, 363976K used, 149088K free, 0K shrd, 161724K buff
Swap: 265032K av, 0K used, 265032K free 49916K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1 root 8 0 544 544 472 S 0.0 0.1 0:04 init
2 root 8 0 0 0 0 SW 0.0 0.0 0:00 keventd
3 root 9 0 0 0 0 SW 0.0 0.0 0:00 kapm-idled
4 root 9 0 0 0 0 SW 0.0 0.0 0:00 kswapd
5 root 9 0 0 0 0 SW 0.0 0.0 0:00 kreclaimd
5) top 항목설명
PID : Process ID
PPID : Parent Process ID
UID : 소유자의 User ID
USER : 소유자
PRI : Priority(우선순위)
NI : Nice Value ( -20 ~ 19 사이의 값으로 작을 수록 우선순위가 높아짐)
SIZE : 프로세스의 코드와 데이터의 크기(KB단위)
TSIZE : 프로세스의 코드 사이즈
DSIZE : 프로세스의 데이터 사이즈
SWAP : 프로세스가 swap한 메모리양
RSS : 프로세스가 사용하는 실제 메모리양
SHARE : 프로세스가 사용하는 공유 메모리의 양'
STAT : 현재 프로세스의 상태를 나타낸다.
LIB : 라이브러리 페이지의 크기
%CPU : CPU 사용 시간 퍼센트
%MEM : 메모리 사용 퍼센트
TIME : 프로세스가 시작하여 사용한 총 CPU 시간
COMMAND : 프로세스를 실행한 명령어 라인
6) top 실행 중의 명령어 옵션
SPACE : 화면을 갱신한다.
h, ? : 도움말을 출력한다.
k : kill명령을 내린다. PID값을 입력하면 종료신호를 보낸다.
i : Zombi, idle 프로세스의 출력을 on/off한다.
n 또는 # : 출력한 프로세스의 수를 지정한다.
q : top을 종료
r : Nice 값을 변경
s : 화면을 갱신하는 시간을 변경
F,f : 보여줄 항목을 추가하거나 삭제
O,o : 보여줄 항목의 순서를 바꿈
l : top의 맨 윗줄(uptime)을 on/off한다.
m : 메모리의 관련된 항목을 on/off한다.
t : 프로세스와 CPU항목을 on/off한다.
c : Command line의 옵션을 on/off한다.
M : 프로세스의 RSS값을 정렬한다.
P : %CPU 값으로 정렬(기본값)
T : Time값으로 정렬
W : 바꾼 설정을 저장

(6) jobs
1) 설명 : 백그라운드로 실행중인 프로세스나 현재중지된 프로세스의 목록을 출력해주는 명령어
이다.
2) 사용법
jobs [option]
3) option
-l : 프로세스번호를 추가해서 보여준다.
4) 사용예
ㄱ. [posein@www posein]$ jobs
[1]- Running find / -name '*.txt' 2>/dev/null >list.txt &
[2]+ Stopped vim abc.txt
=> +는 현재 실행중인 프로세스를 나타내고 -기호는 이전에 실행되었던 프로세스를 의미한
다.
ㄴ. [posein@www posein]$ jobs -l
[1]- 27832 Running find / -name '*.txt' 2>/dev/null >list.txt &
[2]+ 27833 Stopped (tty output) vim abc.txt
=> 프로세스번호도 같이 보여준다. 위 결과는 find 라는 작업이 먼저 수행되었고 그 다음
vi작업이 실행되었다. 현재 수행중인 작업은 vi 이다. 즉 이 경우에 fg라고 명령내리면
작업번호 2가 수행된다.

(7) fg
1) 설명 : 백그라운드 프로세스를 포그라운드 프로세스로 전환하는 명령이다.
2) 사용법
fg [%작업번호]
3) 사용예
ㄱ. [posein@www posein]$ fg
=> 백그라운드 작업을 포그라운드작업으로 전환한다. 만약 백그라운드작업이 여러개가
있을 경우 별도의 작업번호를 부여하지 않으면 현재 수행중인(+기호가 붙은) 작업을
전환한다.
ㄴ. [posein@www posein]$ fg %2
=> 작업번호 2번인 작업을 포그라운드작업으로 전환한다.
4) 참고 : 포그라운드로 실행중인 작업을 끝내려면 ctrl+c키를 눌러 작업을 종료시킨다.

(8) bg
1) 설명 : 포그라운드프로세스를 백그라운드 작업으로 전환하는 명령이다. 프로세스를 실행한 후
[CTRL]+[Z]키를 눌러 작업을 잠시 중지시킨 후에 bg명령어를 이용하여 작업을 백그라운
드로 보낼 수 있다.
2) 사용법
bg [%작업번호]
3) 사용예
[posein@www posein]$ find / -name '*.txt' 2>/dev/null > list.txt // 포그라운드
// [CTRL]+[Z]키를 눌러 대기시킨다.
[1]+ Stopped find / -name '*.txt' 2>/dev/null >list.txt

[posein@www posein]$ bg
[1]+ find / -name '*.txt' 2>/dev/null >list.txt &
=> 백그라운드로 전환된다.

(참고) 프로세스 우선순위
멀티태스킹(Multi-Tasking)이란 한 시스템에서 여러 개의 프로세스가 작동되는 것을 말한다.
리눅스에서 이러한 작업은 프로세스 스케줄러가 정해진 시간만큼만 CPU를 사용할 수 있도록 프로
세스를 교체시키기 때문이다. 프로세스에는 일정한 순서를 나타내는 우선순위가 있다. 이 우선순위
를 나타내는 것이 priority와 nice값이다. 이 값은 ps -l로 확인할 수 있다. PRI는 프로세스의
실제 우선순위로 리눅스가 계산하여 부여한다. 이 PRI를 부여할 때 NI값이 고려된다. NI는 PRI값에
영향을 주기 위해 프로세스 소유자나 슈퍼유저가 설정한 번호로 nice명령을 이용하여 그 값을 설정
할 수 있다.

(9) nice
1) 설명 : 프로세스의 우선순위를 변경하는 명령으로 NI값을 설정할 수 있다. NI값은 -20 ~ 19
까지 있는데 값이 작을 수록 우선순위가 높다. 일반 사용자는 NI값을 증가시킬 수밖에
없고 루트권한자는 값을 감소시켜 우선순위를 높일 수 있다. 기본값은 0이다.
2) 사용법
nice -값 프로세스명
3) 사용예
[posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 76 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 R 501 20904 20843 0 78 0 - 752 - pts/2 00:00:00 ps
[posein@www posein]$ nice -10 bash
[posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 73 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 S 501 20906 20843 0 77 10 - 564 wait4 pts/2 00:00:00 bash
000 R 501 20923 20906 0 79 10 - 753 - pts/2 00:00:00 ps
=> bash의 NI값을 10으로 설정한다. NI값을 변경하면 bash의 자식프로세스인
NI값도 바뀐다.
[root@www /root]# nice --10 bash
=> bash의 NI값을 -10으로 설정한다.
(참고) bash와 NI값
bash는 로그할 때의 부여받는 환경에 가까워서 NI값을 변경하면 실제적으로 우선순위의 변동보다
새로운 bash를 부여받는 쪽에 가깝다.

(10) renice
1) 설명 : 실행중인 프로세스의 우선순위를 변경할 때 사용하는 명령으로 오직 그 프로세스의
소유자와 루트권한자만이 명령을 내릴 수 있다. 이 명령도 NI값을 부여함으로서 우선
순위가 변경되며 루트권한자만이 프로세스의 우선순위를 높일 수 있다.
2) 사용법
renice [options] 값 PID
3) options
-g : 그룹 ID 지정
-u : 사용자 ID 지정
-p : 프로세스 ID 지정(초기값)
4) 사용예
ㄱ. [posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 69 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 S 501 20906 20843 0 79 10 - 564 wait4 pts/2 00:00:00 bash
000 R 501 20937 20906 0 77 10 - 752 - pts/2 00:00:00 ps
[posein@www posein]$ renice 15 20906
20906: old priority 10, new priority 15
[posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 69 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 S 501 20906 20843 0 77 15 - 564 wait4 pts/2 00:00:00 bash
000 R 501 20939 20906 0 79 15 - 752 - pts/2 00:00:00 ps
=> 20906작업의 NI값을 15로 바뀌면서, PRI는 적당한 값으로 자동 설정된다.
ㄴ. [root@www root]# renice 1 987 -u daemon root -p 32
=> 프로세스 ID가 987, 32 인 것과 사용자가 daemon, root인 모든 프로세스의 우선권값을
1로 바꾼다.

(11) nohup
1) 설명: 이 명령은 사용자가 로그아웃하거나 터미널창을 닫아도 해당 프로세스를 백그라운드로
작업될 수 있도록 해주는 명령이다.
2) 사용법
nohup 명령
3) 사용예
nohup tar cvf source.tar /opt/src &
4) 참고
만약 표준출력이 화면이었는데 사용자가 로그아웃하게 되면 표준출력과 표준에러를 'nohup.out'
이라는 파일에 저장한다. 현재 작업디렉토리에 쓰기작업이 불가능한 경우에는 ~/nohup.out를
생성하고 그것도 불가능하게 되면 실행이 되지 않는다. 또한 우선권을 5 만큼 증가시켜 수행하고
실행한 명령을 자동으로 백그라운드로 보내지 않으므로 직접 명령행 뒤에 '&'를 붙여 백그라운드
로 보내주어야 한다.

2007/06/30 10:47 2007/06/30 10:47

댓글을 남겨주세요.

[로그인][오픈아이디란?]

[MySQL] `utf8` or `euckr` charset 설정

Posted at 2007/06/30 10:46 // in 데이터베이스™/MySQL // by 블루비
/etc.my.cnf 파일을 얼어 아래의 charset 에 맞게 셋팅 후 mysql 을 재실행한다.

---------------------- utf8 ---------------------------

[mysqld]
init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci



---------------------- euckr ---------------------------
[mysqld]
init_connect=SET collation_connection=euckr_korean_ci
init_connect=SET NAMES euckr
default-character-set=euckr
character-set-server=euckr
collation-server=euckr_korean_ci



--------------------------------------------------------

# killall mysqld
# /usr/bin/mysqld_safe&

2007/06/30 10:46 2007/06/30 10:46

댓글을 남겨주세요.

[로그인][오픈아이디란?]