파일 이름을 euc-kr에서 utf-8로 일괄적으로 변환하기

리눅스 2014.01.20 14:03
#!/bin/sh
  
for X in `find .`;do
    filename=`echo $X | iconv -f euc-kr -t utf-8`
    mv "$X" "$filename"
done


출처: http://b4you.net/blog/194


저작자 표시
신고

설정

트랙백

댓글

logwatch 시스템 로그 메일로 받기

리눅스 2013.11.08 11:06

logwatch 시스템 로그 메일로 받기

 

1. logwatch 설치 확인
[root@byungun ~]# rpm -qa | grep logwatch
logwatch-7.3-8.el5

 

2. logwatch 설치
[root@byungun ~]# yum install logwatch

 

3. logwatch 설정 파일
/usr/share/logwatch/default.conf/logwatch.conf :
설정 파일
/etc/cron.daily/0logwatch :
크론(하루에 한 번 구동)

 

4. 메일주소 변경(받는 메일)
[root@byungun ~]# vi /usr/share/logwatch/default.conf/logwatch.conf
---------------------------------------------------------------------
# Default Log Directory
# All log-files are assumed to be given relative to this directory.
LogDir = /var/log

 

# You can override the default temp directory (/tmp) here
TmpDir = /var/cache/logwatch

 

# Default person to mail reports to. Can be a local account or a
# complete email address.
#MailTo = root
MailTo =
webmaster@sangchul.kr
# Default person to mail reports from. Can be a local account or a
# complete email address.
MailFrom = Logwatch
---------------------------------------------------------------------

 

5. 보내는 메일 도메인 변경
[root@byungun ~]# vi /etc/hosts
---------------------------------------------------------------------
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1               byungun byungun.secdns.co.kr localhost
#127.0.0.1              byungun localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
---------------------------------------------------------------------

 

6. 메일 보내기(메일 테스트)
[root@byungun cron.daily]# cd /etc/cron.daily
[root@byungun cron.daily]# ./0logwatch

 

출처: http://sangchul.kr/194

 

 

저작자 표시
신고

설정

트랙백

댓글

MySQL INSERT 성능 향상

리눅스 2013.11.07 15:16

MySQL 테이블에 INSERT 구문을 수행 시킬때 성능을 향상시킬 수 있는 방법입니다.

여러 데이터를 INSERT 구문으로 수행시 VALUES 리스트를 다중으로 사용하는것이 개별적으로 INSERT것보다 빠릅니다. 비어 있지 않은 테이블에 INSERT를 수행한다면 my.ini 파일 안에 bulk_insert_buffer_size 를 변경하여 속도를 개선 시킬 수 있습니다.

INSERT INTO `테이블` (필드1, 필드2) VALUES ('값1', '값2'),('값1', '값2')...('값1', '값2');

# My.ini 파일 내에 bulk insert buffer size를 변경하고 MySQL을 재시작 합니다.
bulk_insert_buffer_size = 64M

여러 클라이언트에서 대량의 데이터를 삽입을 한다면 INSERT DELAYED 명령문을 사용하면 속도를 개선 할 수 있습니다. 서버로 부터 수행 응답을 받은 후 큐에 적재 후 테이블에 사용이 되지 않을때 테이블에 삽입이 됩니다.  INSERT DELAYED 는 MyISAM, MEMORY, ARCHIVE 테이블에서 사용 가능합니다. 그외 테이블에서는 성능 저하가 발생 할 수 있습니다. affected row 값은 테이블이 바쁘지 않을때는 정확한 값을 출력을 하나 그렇지 않을때는 1의 값을 반환을 합니다. DELAYED 이외에 LOW_PRIORITY, IGNORE, HIGI_PRIORITY 등을 이용하여 작업의 순위, 중복 오류등을 무시 할 수 있습니다.
LOW_PRIORITY : 최 하위 순위로 INSERT구문을 수행합니다. 다른 클라이언트의 SELECT가 종료된 후 수행합니다.
IGNORE : 키 중복 (PRIMARY KEY, UNIQUE KEY)의 오류를 무시하고 진행합니다.
HIGH_PRIORITY : 최 우선 작업으로 INSERT구문을 수행합니다.

INSERT DELAYED 구문을 수행할때에는 Slave replaction 와는 다른 데이터를 가질 수 있습니다.
INSERT DELAYED INTO `테이블` (필드1, 필드2) VALUES ('값1', '값2'),('값1', '값2')...('값1', '값2');

대량의 데이터를 삽입을 할때는 LOAD DATA INFILE 을 사용합니다. 대량의 데이터를 INSERT 구문을 이용해서 삽입을 하는것 보다, 필드 구분자로 분리가된 LOAD DATA INFILE 을 이용하면 INSERT 구문보다 매우 빠른 동작을 합니다.

Slave Replaction 에 동일한 구문이 전달이 가능하고 INSERT가 가능합니다.
-- 필드 구분이 , (쉼표) 로 되어 있고 라인 구분이 개행으로 되어 있을때 아래와 같이 수행하면 됩니다.
LOAD DATA INFILE '파일경로' INTO TABLE `테이블명` FIELDS TERMINATED BY ',' LINES TERMINATED By '\r'

INDEX가 많이 사용된 테이블에 대량으로 INSERT 구문 시 INDEX를 비활성화 한 후 수행을 하는것이 좋습니다. 한개의 열을 삽입하고 인덱스를 계산 후 다시 다른 행을 삽입하는 것 보다는 전체 키를 비 활성화 한 후에 데이터 입력이 종료되고 다시 키를 활성화 시키는것이 전체적으로 빠른 수행을 할 수 있습니다.
-- 테이블의 INDEX를 비활성화 시킵니다.
ALTER TABLE `테이블` DISABLE KEYS;
-- 대량 INSERT 구문을 수행합니다.
INSERT INTO `테이블` VALUES ('값1', '값2')....;
.....
INSERT INTO `테이블` VALUES ('값1', '값2')....;
-- 수행이 종료된 후 다시 INDEX를 활성화 시킵니다. 
ALTER TABLE `테이블` ENABLE KEYS;

트랜젝션이 지원하지 않는 테이블PROCEDURE , FUNCTION , 다중 쿼리문 에서 수행되는 INSERT연산의 속도를 향상 시키기 위해서는 테이블 잠금을 실행하여 속도를 향상 시킬 수 있습니다. 인덱스 버퍼 플러시를 매번 수행하지 않고 모든 INSERT 구문의 모든 열이 삽입 되었을때 인덱스 버퍼 플러시가 이루어져 성능향상이 됩니다.
-- 테이블의 WRITE 잠금을 수행합니다.
LOCK TABLES `테이블` WRITE;
-- 대량 INSERT 구문을 수행합니다.
INSERT INTO `테이블` VALUES ('값1', '값2')....;
.....
INSERT INTO `테이블` VALUES ('값1', '값2')....;
-- 테이블의 WRITE 잠금을 해제 합니다.
UNLOCK TABLES `테이블` WRITE;

트랜젝션이 지원하는 테이블에서는 START TRANSACTION 과 COMMIT을 활용하면 성능이 향상이 됩니다.

위와 같이 MySQL INSERT 수행시 성능을 향상시킬 수 있습니다.
참고 : MySQL 메뉴얼 (Speed of INSERT Statements)

 

출처: http://www.lovelgw.com/Blog/225

저작자 표시
신고

설정

트랙백

댓글

Dovecot Trouble Shooting

리눅스 2013.10.27 10:22


1. Imap, pop3 포트 변경 시
vi /etc/dovecot.conf

protocol imap {
listen = *:변경할 포트
}

protocol pop3 {
listen = *:변경할 포트
}

2. 홈디렉토리 없는 사용자의 메일을 받고 싶을 때
vi /etc/dovecot.conf

mail_location = mbox:/var/empty:INBOX=/var/spool/mail/%u:INDEX=MEMORY
로 변경
/etc/init.d/dovecot restart
adduser -M -s /bin/false 계정명

3. Imap 로그인 시 로그인 되지 않고, Plaintext 메시지 출력시
vi /etc/dovecot.conf

#disable_plaintext_auth = no
주석 해제호 dovecot 서비스 재시작

4. Centos 6.x 이슈사항
설정파일 위치 : /etc/dovecot/dovecot.conf
해당 버전에서의 dovecot은 /etc/dovecot/conf.d/ 폴더에 추가 설정파일이 분산 저장됨
A. 포트 변경 참조파일 : 10-master.conf
B. Pop3 미 사용 참조파일 : 10-ssl.conf
C. disable_plaintext 참조파일 : 10-auth.conf
D. 메일경로 변경 참조파일 : 10-mail.conf


출처: http://igoni.kr/?p=105

저작자 표시
신고

'리눅스' 카테고리의 다른 글

logwatch 시스템 로그 메일로 받기  (0) 2013.11.08
MySQL INSERT 성능 향상  (0) 2013.11.07
Dovecot Trouble Shooting  (0) 2013.10.27
특정 IP 또는 IP 대역만 SSH 접속 허용  (0) 2013.07.21
centos 트랜스미션 설치  (0) 2013.07.07
CentOS 6.x selinux 해제  (0) 2013.06.07

설정

트랙백

댓글

특정 IP 또는 IP 대역만 SSH 접속 허용

리눅스 2013.07.21 22:32

서비스에 필요한 포트를 제외하고는 모두 접속 금지시키는 것이 좋습니다. 즉, 80번 HTTP 포트를 제외하고 나머지 포트는 모두 막는 것이 좋겠지만 실질적으로는 불가능합니다.

시스템 관리에 FTP, SSH 등을 안 사용할 수가 없기 때문입니다. 따라서 이러한 포트는 불특정다수의 접근을 막기 위해 포트를 변경하고 특정 IP 또는 특정 IP 대역만 접속 허용시켜주면 시스템 보안상 매우 좋습니다.

특정 IP 또는 특정 IP 대역만 SSH 접속할 수 있도록 TCP Wrapper를 사용합니다.

1. 데몬 프로그램이 TCP Wrapper 지원하도록 컴파일되었는지 확인

먼저 SSH, FTP 프로그램이 TCP Wrapper를 지원하는지 확인할 필요가 있습니다.

우분투의 경우 아래와 같이 sshd 프로그램의 경우 libwrap.so 라이브러리와 연동되어 있어 TCP Wrapper를 지원합니다.

$ ldd /usr/sbin/sshd | grep libwrap.so
        libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f98ae25f000)

반면에 /usr/sbin/apache2 아파치의 경우에는 TCP Wrapper를 지원하지 않습니다.

 

 

SSH와 TCP Wrapper

2. TCP Wrapper 사용

현재 대부분의 리눅스 배포판에 TCP Wrapper가 기본 설치되어 있으므로 여러분은 다음 두 파일만 수정하면 자동 적용됩니다.

  • /etc/hosts.deny시스템에 접근 금지할 호스트의 주소 목록
  • /etc/hosts.allow시스템에 접근 가능한 호스트의 주소 목록

위 두 파일을 열어서 그 내용을 보면 모두 # 으로 시작하는 줄이기 때문에 모두 주석이고 아무런 내용이 없습니다.

2-1. 기본 정책은 모든 호스트에서 모든 서비스에 접속 금지

/etc/hosts.deny 파일 수정

ALL: ALL

콜론 앞의 ALL은 모든 서비스입니다. 모든 서비스라고 했지만 TCP Wrapper 접근 제한 적용을 받는 데몬은 현재 sshd뿐입니다.

콜론 뒤의 ALL은 모든 호스트입니다. 기본적으로 모든 서비스를 모든 호스트에서 접근하지 못하도록 설정합니다.

2-2. 접속 허용할 호스트 나열

/etc/hosts.allow 파일 수정

ALL: 127.0.0.1 # localhost
ALL: 192.168.56.101 # localhost
ALL: 118.71.224.196 # 사무실
ALL: 124.53.123. # 집

콜론 앞의 ALL은 모든 서비스입니다. 현재는 sshd만 TCP Wrapper 적용되고 있습니다.

콜론 뒤에 적는 IP 주소 또는 IP 주소 대역은 서버에 접근할 수 있습니다.

따라서 실제 주소는 여러분의 네트워크 설정에 따라 다릅니다. 127.0.0.1 주소는 로컬호스트를 의미하고 192.168.56.101 주소와 같이 서버에 할당된 IP를 적어줍니다. 이와 같이 서버 자체에서는 아무런 제한이 없도록 합니다.

그리고 사무실이 고정 IP를 사용한다면 예시처럼 118.71.1224.196 이렇게 적어줍니다. 하지만 유동 IP를 사용하는 일반 가정집의 경우에는 124.53.123. 이와 같이 IP 대역을 적어줍니다. 물론 실제 IP 주소는 여러분의 환경에 따라 다릅니다.

2-3. 불법적 접근 확인

만약 허용되지 않은 IP에서 SSH 접속을 시도할 경우 아래와 같은 에러 메시지가 /var/log/auth.log 파일에 기록됩니다.

Dec 23 15:41:00 test sshd[7089]: refused connect from 118.71.224.196 (118.71.224.196)

지금까지 TCP Wrapper를 활용 특정 IP 또는 IP 대역만 SSH 접속 허용하는 방법을 살펴봤습니다.

핀코인은 서버 보안과 안전을 위해 80 포트 외에 모든 포트를 금지하고 있습니다. 불법적인 접근은 항상 모니터링하고 있으며 믿을 수 있는 핀코인에서 온라인 상품권 구매 잊지 마세요.

감사합니다.

 

출처: http://blog.pincoin.co.kr/2012/12/23/%ED%8A%B9%EC%A0%95-ip-%EB%98%90%EB%8A%94-ip-%EB%8C%80%EC%97%AD%EB%A7%8C-ssh-%EC%A0%91%EC%86%8D-%ED%97%88%EC%9A%A9/

저작자 표시
신고

'리눅스' 카테고리의 다른 글

MySQL INSERT 성능 향상  (0) 2013.11.07
Dovecot Trouble Shooting  (0) 2013.10.27
특정 IP 또는 IP 대역만 SSH 접속 허용  (0) 2013.07.21
centos 트랜스미션 설치  (0) 2013.07.07
CentOS 6.x selinux 해제  (0) 2013.06.07
crontab 설정 및 로그설정  (0) 2013.06.07

설정

트랙백

댓글

centos 트랜스미션 설치

리눅스 2013.07.07 19:14

Seedbox는 디지털 파일의 업/다운로드를 위해 사용되는 개인 전용 서버를 말합니다. 


토렌트, HTTP, FTP, SFTP, RSYNC 등의 프로토콜로 접근이 가능합니다. 


즉, 하나의 파일을 여러가지 클라이언트로 다운로드 가능합니다.

 

CentOS 5.6 64bit 에서 셋팅 방법입니다.

 

[참고]

1. http://www.diyseedbox.com/tutorial-dedicated-torrent-seedbox-server/

2. http://geekery.blog.com/2011/02/17/transmission-2-2-1-daemon-cli/



1. 필요 패키지 설치

yum -y install gcc gcc-c++ make openssl-devel pkgconfig curl-devel perl-XML-Parser perl-libwww-perl gettext

yum -y upgrade

 

2. intltool 설치

cd /usr/local/src

wget -q http://ftp.gnome.org/pub/gnome/sources/intltool/0.40/intltool-0.40.6.tar.gz

tar zxf intltool-*.tar.gz

cd intltool-*

./configure --prefix=/usr

make -s

make -s install

3. libevent 설치
cd /usr/local/src

wget -q http://monkey.org/~provos/libevent-2.0.10-stable.tar.gz

tar zxf libevent-*.tar.gz

cd libevent-*

./configure --prefix=/usr

make -s

make -s install
 
4. Transmission 설치
cd /usr/local/src

wget -q http://download.m0k.org/transmission/files/transmission-2.22.tar.bz2

tar xjf transmission-*.tar.bz2

cd transmission-*

./configure --prefix=/usr --disable-gtk --disable-libappindicator --disable-libcanberra --disable-gconf2 LIBEVENT_CFLAGS=-I/usr/include LIBEVENT_LIBS="-L/usr/lib -levent"

make -s

make -s install
 
5. 사용자 계정 생성
useradd -m transmission

passwd transmission
 
6. init 스크립트 생성
wget -O /etc/init.d/transmissiond http://pastie.org/pastes/962731/download

chmod 755 /etc/init.d/transmissiond
 
7. Transmission daemon 부팅시 자동실행 설정
chkconfig --add transmissiond

chkconfig --level 345 transmissiond on
 
8. Transmission daemon 시작/종료
service transmissiond start

service transmissiond stop

 
이때 에러가 발생했다. 아래 URL에서 RPM 다운받고 설치해서 해결됨
http://geekery.blog.com/2011/02/17/transmission-2-2-1-daemon-cli/
 
9. Transmission 설정
cd /home/transmission/.config/transmission/

sed -i 's/^.*rpc-whitelist-enabled.*/"rpc-whitelist-enabled": false,/' settings.json

sed -i 's/^.*rpc-authentication-required.*/"rpc-authentication-required": true,/' settings.json

sed -i 's/^.*rpc-username.*/"rpc-username": "username",/' settings.json

sed -i 's/^.*rpc-password.*/"rpc-password": "password",/' settings.json
 
10. 디렉토리 생성

mkdir -p /home/transmission/Downloads/


chown -R transmission.transmission /home/transmission/Downloads/

chmod g+w /home/transmission/Downloads/

11. Transmission 시작
service transmissiond start
 
12. ConfigServer Security & Firewall application 설치
cd /usr/local/src

wget http://www.configserver.com/free/csf.tgz

tar zxf csf.tgz

rm -f csf.tgz

cd csf

./install.generic.sh
 
cd /etc/csf

sed -i 's/^TESTING =.*/TESTING = "0"/' csf.conf

sed -i 's/^TCP_IN =.*/TCP_IN = "21,22,9091,51413,30000:35000"/' csf.conf

sed -i 's/^TCP_OUT =.*/TCP_OUT = "1:65535"/' csf.conf

sed -i 's/^UDP_IN =.*/UDP_IN = "20,21,51413"/' csf.conf

sed -i 's/^UDP_OUT =.*/UDP_OUT = "1:65535"/' csf.conf

service csf restart
 
13. 확인
 
http://[YOUR_SERVER_IP]:9091/transmission/web/



출처: http://shapeace.tistory.com/160


저작자 표시
신고

'리눅스' 카테고리의 다른 글

Dovecot Trouble Shooting  (0) 2013.10.27
특정 IP 또는 IP 대역만 SSH 접속 허용  (0) 2013.07.21
centos 트랜스미션 설치  (0) 2013.07.07
CentOS 6.x selinux 해제  (0) 2013.06.07
crontab 설정 및 로그설정  (0) 2013.06.07
cron이 환경변수를 상속하지 않는 이유  (0) 2013.06.07

설정

트랙백

댓글

CentOS 6.x selinux 해제

리눅스 2013.06.07 21:42

출처: http://pplane.tistory.com/admin/entry/post

 

SELinux는 정부와 업계가 만든 제품으로 NSA, Network Associates, Tresys가 설계하고 개발했다. 

비록 NSA가 패치 집합을 공개했지만, 2.6부터 리눅스 커널 주류로 편입됨.


SELinux 기능 끄기와 켜기 


    1) 설정파일 

  /etc/sysconfig/selinux 파일에 설정이 있으며 


SELINUX 지시어의 값을 변경하면 된다. 

켜기 : # SELINUX=enforcing 

끄기 : # SELINUX=disabled 


# vi /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#       enforcing - SELinux security policy is enforced.

#       permissive - SELinux prints warnings instead of enforcing.

#       disabled - SELinux is fully disabled.

SELINUX=disabled

# SELINUXTYPE= type of policy in use. Possible values are:

#       targeted - Only targeted network daemons are protected.

#       strict - Full SELinux protection.

SELINUXTYPE=targeted


# 참고 


SELINUX 지시어는 enforcing,permissive,disabled 세가지가 있으며 

enforcing : 보안정책을 적용시킨다는 뜻이다 

permissive : enforcing시 발생하는 경고메세지를 출력하는 모드이다 

    disabled  : 보안정책을 사용하지 않는다는 뜻이다 


SELINUXTYPE 지시어는 정책 적용방싱르 나타네며 targeted, strict 두가지가 있다 

targeted : 네트웍 데몬에 대해서 보안정책을 적용하는 것 

    strict  : 시스템전체에대해 보안정책을 적용하는 것이다 



    2) 명령어 

setenforce 라는 명령를 이용하여 SELinux를 켜고 끈다 

setenforce의 경우 boolean 값을 갖는다. 

켜기 : # setenforce 1 

끄기 : # setenforce 0 


    3) 부팅옵션에 추가 

grub.conf에 부팅옵셩을 줘서 설정할수 있다 

켜기 : selinux=1 

끄기 : selinux=0

신고

설정

트랙백

댓글

crontab 설정 및 로그설정

리눅스 2013.06.07 11:54

출처: http://dokeby.tistory.com/55

 

이름
crontab - cron 처리를 위한 테이블 파일  

설명
crontab 파일에 담길 내용을 cron(8) 데몬에 의해 실행될 특정 내용인데, 그 일반적인 형식은, ``이 명령을 이날 이시간에 실행하라'' 식이다. 각 사용자는 자신의 crontab 파일을 사용할 수 있으며, crontab 파일에서 지정한 명령은 자신의 프로세스로 실행된다. 일반적으로 uucp, news 같은 것을 이 crontab 파일에 지정하며, su(1) 명령으로 사용자를 바꾸었으나, 이전 사용자의 프로세스로 실행 하고자 할때 주로 사용된다.
빈 줄, 공문자나, 탭문자로 시작하는 줄, 줄 첫칸에 `#' 문자가 있는 줄은 모두 무시된다. 또한 cron 명령이 지정되어 있는 줄 안에서는 주석을 사용할 수 없다. 또한, 환경변수 설정하는 곳에는 이 주석문을 사용할 수 없다.

cron 데몬에서 처리될 각 줄은 환경변수가 지정되어 있는 줄이나, cron 명령이 지정되어 있는 줄이다. 환경변수를 지정하는 형식은 다음과 같다. 

    name = value

`=' 문자 사이에 있는 공백문자는 선택적이다. name 의 값으로 지정되는 value 에는 공백문자가 없어야한다. value 값에 공백문자가 있을 경우에는 따움표(작은 따움표나, 큰 따움표, 짝이 맞아야함)로 지정한다.

여러 환경 변수들은 cron(8) 데몬에 의해 자동으로 지정된다. SHELL 값은 /bin/sh, LOGNAME과 HOME 값은 /etc/passwd 파일에서 그 crontab 파일 소유주의 것을 취한다. HOME 값과 SHELL 값은 crontab 파일에서 새롭게 지정될 수도 있지만, LOGNAME 값은 바꿀 수 없다.

(참고: LOGNAME 변수는 BSD 시스템에는 USER 라는 이름으로 사용된다. 이때는 USER 변수에 그 값이 지정된다.)

LOGNAME, HOME, SHELL 변수 값들은, cron(8) 데몬에 의해서, crontab에서 지정한 한 명령의 실행 결과를 MAILTO 명령을 사용할 때, 사용된다. MAILTO 명령이 지정되면(즉, 비어있어 않으면), 이 변수 값들을 이용해서, 그 사용자에게 편지를 보낼 것이며, MAILTO 명령이 지정되어 있지 않으면(MAILTO=""), 편지를 보내지 않는다. 한편, 윗 변수들을 따로 지정하지 않았다면, 그 crontab 파일의 소유주에게 편지가 보내진다. 이 기능은 편지를 보내는 풀그림으로 /usr/lib/sendmail 대신에, /bin/mail 명령을 사용할 경우에 유용한데, /bin/mail 명령은 aliasing(편지 받는이의 주소를 별칭으로 사용하는 기능) 하지 않고, uucp 명령은 일반적으로 그 편지를 읽지 않기때문이다. (무슨 말인지.. ^^)

cron 명령의 형식은 V7 표준과 비슷하다. 각 줄은 다섯개의 시간과 날짜 필드, 다음에, 사용자 이름(시스템 crontab 파일일 경우), 다음에, 실행될 명령이런 형식이다. 지정한 명령은 데몬에 의해, 지정한 날짜, 시간에 실행된다.(아래 설명 참조) cron(8) 데몬은 매 분단위로 그 시간을 확인한다. 시간과 날짜 필드는 다음 값이 사용된다.

필드           사용할 수 있는 값

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

분            0-59

시            0-23

날짜          0-31

달            0-12 (아래 참조, 달 이름을 사용 가능)

요일          0-7 (0 또는 7: 일요일 , 요일이름을 사용 가능)


한 필드에 `*' 문자가 올 수 있는데, 이것은 그 단위 전체를 말한다. (예를 들어, 날짜 부분에 `*' 문자가 오면 `매일'을 뜻한다)

숫자의 범위가 사용될 수 있다. 범위는 하이픈(`-') 문자로 지정하며, 앞에 숫자가 뒷 숫자보다 작아야한다. 예를 들어, 시간 필드에 ``8-11'' 이 오면, 8, 9, 10, 11시를 뜻한다.

또한 이 값들은 나열될 수 있으며, 그 구분은 쉼표(`,')로 한다. 예: ``1,2,5,9'', ``0-4,8-12''.

값의 범위를 지정할 때, 특정 단위로 건너 뛸 수 있는데, 이것은 그 범위 다음에 ``/<숫자>'' 형식으로 덧붙혀 준다. 예를 들어, 시간 필드에 ``0-23/2'' 값이 사용되면, 이것은 두시간 마다, 즉 ``0,2,4,6,8,10,12,14,16,18,20,22'' 시를 뜻한다. 또한 ``매 두시간 마다''라는 뜻으로, ``*/2'' 이런식으로 사용될 수 있다.

``달''과 ``요일'' 필드에는 그 달의 이름과, 요일의 이름이 사용될 수 있다. 이 이름의 앞에서부터 세글자 정도만 구별되면 된다. 이 이름을 사용할 때는 범위가 지정될 수 없다.

여섯번째 필드(줄의 마지막)에는 실행시킬 명령이 온다. 그 명령이 실행될 때 줄을 나누는 것은 `%' 문자로 하며, 즉, 이것은 쉘에 의해서 다른 명령이 실행됨을 의미한다. (`%' 문자 앞에 있는 것이 하나의 쉘 명령이며, 뒤에 있는 것이 또다른 하나의 쉘 명령임을 뜻한다.) 또한 한 명령인데, 부득이하게 줄을 나누워야 할 경우에는 백슬래쉬(\) 문자를 사용한다.

참고: 날짜와 요일의 지정에서 중복되는 경우는, 그것이 모두 포함된다. 예를 들어,
``30 4 1,15 * 5'' 이것은 매달 1일, 15일날 4시 30분에 실행되면서, 또한 매주 금요일날도 함께 실행됨을 의미한다.  

crontab 파일 예제
# 명령어를 실행 쉘 지정
SHELL=/bin/sh
# 편지를 받을 사용자 지정
MAILTO=paul
#
# 매일 00시 05분에 특정작업을 하는 경우
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# 매달 1일 오후 2시 15분에
15 14 1 * *     $HOME/bin/monthly
# 월요일부터 금요일 까지 매일 오후 10시에.
0 22 * * 1-5   mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "이것은 매일 0, 2, 4, ... 시 23분에 보여집니다."
5 4 * * sun     echo "이것은 매 일요일 오전 4시 5분에 보여집니다."

 
관련항목
cron(8), crontab(1)  
확장
요일을 지정할 때, 0, 7 숫자 둘다, 일요일을 뜻한다. 이것은 BSD, ATT 에서 다르게 적용되기에 사용되었음.
값 나열을 하는 방식, "1-3,7-9" 형식의 값은 ATT, BSD cron에서 바르게 동작하지 않음 - 여기서는 "1-3", 또는 "7,8,9" 값만 적용됨.

건너뜀 기능 사용 가능, "1-9/2" = "1,3,5,7,9".

달 이름과 요일 이름을 사용 가능.

환경 변수 지정 가능. BSD, ATT에서는 /etc/rc에 바탕으로 한 하위 프로세스에서만 지정이 가능함.

편지 보기 기능 가능(BSD에서는 이런 기능 없음), 또한 다른 특정 사용자에게 편지를 보낼 수 있음(SysV에서는 이런 기능 없음), 또한 편지 기능 보내기 사용하지 않을 수도 있음(SysV에서는 이런 기능 없음).  


추가 항목

로그 파일 정보

crontab을 설정해두고 제대로 실행이 되었는지 여부를 알 수가 없습니다.
(데이터를 확인했는데 변화가 없을경우) 

그럴경우 로그를 확인할 때 다음 위치에서 확인 할 수 있습니다.


/var/spool/cron   <<  crontab 설정 파일
/var/log/cron      << crontab 실행 로그

로그 정보를 파악하는것도 필수라고 생각 되네요.

신고

'리눅스' 카테고리의 다른 글

centos 트랜스미션 설치  (0) 2013.07.07
CentOS 6.x selinux 해제  (0) 2013.06.07
crontab 설정 및 로그설정  (0) 2013.06.07
cron이 환경변수를 상속하지 않는 이유  (0) 2013.06.07
라이브러리 로딩 - ld.so.conf  (0) 2013.06.06
crontab 시간 설정방법  (0) 2013.05.24

설정

트랙백

댓글

cron이 환경변수를 상속하지 않는 이유

리눅스 2013.06.07 11:23

이번에 cron에 어떤 쉘 스크립트를 등록했는데 제 시간에 수행되지 않는 경험을 했습니다. 그래서 우선 cron내지는 crontab으로 검색을 해보니 "crontab에 등록했는데 실행이 안돼요."라는 글들이 많았고 답변을 보면 대부분 환경변수 때문이었습니다.

이런 경험을 한 사람이 많은 이유가 뭘까요? 아마도 exec family 함수들 중에서 execle(), execve()를 제외한 다른 함수들은 current process의 환경변수들을 child process에게 상속시키는데, 늘 사용하는 bash같은 쉘들도 그렇게 구현해 놓았기 때문에 무의식 중에 상속된다고 여기고 있었던 탓같습니다.

그럼 crond는 왜 child process에게 환경변수를 상속하지 않는 것일까요? 그 이유는 user 마다 자신만의 crontab을 등록할 수있기 때문입니다. 아마 대부분의 시스템에 crond는 root로 실행되고 있을 것이고, 다른 user의 crontab을 실행시켜줄 때 당연히 root의 환경변수를 상속해서는 안됩니다. 반대로 쉘의 입장에서 생각해보면 su를 이용해서 다른 계정으로 전환하지 않는한 자신의 환경변수를 상속하는게 당연합니다.

정리하면, cron처럼 uid가 다른 child process를 fork & exec할 때는 execle()를 이용해서 명시적으로 환경변수를 상속하지 않는 것이 맞고, 다른 대부분의 경우에는 parent process의 환경변수를 상속받는게 편합니다.


이상의 이유를 담고 있는 cron의 사용법에 대해서 얘기를 하자면, crontab에 등록된 쉘 스크립트 또는 바이너리가 사용할 모든 환경변수들은 아래처럼 crontab 첫 머리에 등록해줘야 합니다. 예를 들어 PATH에 추가되는 사항이 있다면 꼭 적어줘야 합니다.  

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

그렇게 내용을 수정한 이후에 "#crontab -u user /etc/crontab"과 같이 crontab을 다시 등록해야 합니다.

이게 싫으면 각 쉘 스크립트 내지는 바이너리에서 환경변수를 한번 더 신경쓰면서 짜야합니다. :(
그래서 또 스치는 의문이 하나 있었는데, 혹시 cron이 똑똑하게 마치 쉘이 처음 실행되 듯이 시스템 default profile과 user별 profile을 찾아서 export해주진 않을까? 궁금해서 찾아봤습니다.

그 결과 최대한 심플하게 오로지 crontab에 등록된 환경변수들만 export한다는 것입다. 다시 왜 그랬을까 생각해보면 쉘이야 자기가 필요로 하는 default 파일 명을 define하고 시작할 수 있지만, cron이 입장에서는 어떤 쉘위에서 수행될 지도 모르는 판에 그 짓(?)을 할 수는 없겠구나 싶었습니다.


※ 참고로 cron의 총 코드의 양은 *.c *.h만 계산했을 때 예상보다 훨씬 긴 4400여 줄정도였습다. 그리고 내용을 조금 둘러보고 개발한 Paul Vixie에게 작은 존경을 표하고 싶을 정도로 각종 시스템 프로그래밍의 진수가 많이 녹아 있어서 학생들이 보면 좋을 교재같은 코드였습다. 그리고 코드의 정리도 깔끔했고 주석도 잘 달려있었습니다. 관심과 시간이 있으면 한번 구경해보시길 바라면서 이만...

신고

'리눅스' 카테고리의 다른 글

centos 트랜스미션 설치  (0) 2013.07.07
CentOS 6.x selinux 해제  (0) 2013.06.07
crontab 설정 및 로그설정  (0) 2013.06.07
cron이 환경변수를 상속하지 않는 이유  (0) 2013.06.07
라이브러리 로딩 - ld.so.conf  (0) 2013.06.06
crontab 시간 설정방법  (0) 2013.05.24

설정

트랙백

댓글

라이브러리 로딩 - ld.so.conf

리눅스 2013.06.06 17:45

출처: http://blog.daum.net/mzinboy/3

 

라이브러리란 무엇인가?
프로그램에서 공통으로 사용할 수 있는 기능을 포함하고 있는 오브젝트 파일이다.

 

동적 라이브러리란 무엇인가?
프로그램을 컴파일하여 생성되는 바이너리에 포함하지 않고 바이너리가 실행하는 시점 또는 실행 후에 포함시킬 수 있도록 제작된 라이브러리를 말한다. 그래서 동적이라는 이름이 붙은듯!! 이런 형식의 라이브러리는 프로그램을 실행할 때 호출되는 로더에 의해서 메모리에 적재된다.

 

동적 라이브러리를 호출하기 위해서는 path 지정이 필수이다. 해당 라이브러리가 어디에 위치해 있는지 모든 디렉토리를 탐색하기에는 비효율적이기 때문이다. 우리가 흔히 설정하는 LD_LIBRARY_PATH 환경변수가 동적 라이브러리 호출을 위한 path 지정에 사용되는 환경 변수이며 또 다른 방법으로 시스템 설정을 통해서 지정할 수 있다. 이때 사용되는 설정 파일이 리눅스 기준으로 /etc/ld.so.conf 파일이 되겠다. 리눅스 Kernel 2.6 이후 부터 /etc/ld.so.conf.d 디렉토리에 *.conf 파일 형식으로 설정할 수 있다.

 

로더는 LD_LIBRARY_PATH 또는 ld.so.conf 에 명시된 디렉토리에서 동적 라이브러리를 찾으며 해당 디렉토리에 없으면 Not Found 에러를 출력한다. 컴파일시 link 오류나 실행시 loading 오류를 만나게 된다면 위 두가지 설정을 점검해 보기 바란다.

 

LD_LIBRARY_PATH 나 ld.so.conf 두군대 모두에게 설정될 필요는 없으나 다음과 같은 경우에는 ld.so.conf 에 설정하도록 유의해 보자. 바이너리에 setuid, setgid 등이 설정된 경우 리눅스의 로더는 LD_LIBRARY_PATH 환경 변수 설정을 무시해 버린다고 한다. 그도 그럴것이 악의적으로 시스템 주요 함수들이 setuid를 가진 바이너리가 호출한 라이브러리에 의해서 오버라이딩 된다면??? 끔직할 것이다. 그런 보안을 고려한 것인지 모르겠지만 로더는 ( uid != euid || gid != egid ) 상황에서 LD_LIBRARY_PATH 를 무시하기 때문에 아무리 컴파일시에 link가 정상이고 ldd로 확인해도 정상이지만 바이너리 실행시 해당 라이브러리를 찾을 수 없다는 오류를 만나게 될 것이다. 이런 경우는 LD_LIBRARY_PATH가 아니라 ld.so.conf 에 설정을 해줘야 한다.

 

공부를 하는 동안 관련된 몇 가지 링크와 명령어에 대해서 조금더 조사를 했다.

 

관련 링크 :  

관련 명령어 :

  • ldconfig - /etc/ld.so.conf 설정된 동적 라이브러리 정보를 /etc/ld.so.cache 파일로 만들어 주는 일을 한다. 이로서 로더는 ld.so.cache 정보를 기반으로 보다 빠르게 라이브러리를 찾아 낼 수 가 있다. ld.so.conf 설정을 변경하면 반드시 ldconfig 명령을 수행하여 cache 를 갱신해 주도록 하자.

    ldconfig
    ldconfig -p

  • ldd - 공유 라이브러리의 의존성을 검사해 준다. 동적 라이브러리도 공유 라이브러리 이므로 link 시나 load 시에 에러가 난다면 점검을 해보자.

    ldd <binary name>

  •  objdump - 오브젝트 파일에 대한 정보를 출력해 준다. Dynamic Section의 NEEDED 로 표기된 항목이 공유 라이브러리를 표시한다고 한다.
    objdump -p <object(binary) name>

 

신고

'리눅스' 카테고리의 다른 글

centos 트랜스미션 설치  (0) 2013.07.07
CentOS 6.x selinux 해제  (0) 2013.06.07
crontab 설정 및 로그설정  (0) 2013.06.07
cron이 환경변수를 상속하지 않는 이유  (0) 2013.06.07
라이브러리 로딩 - ld.so.conf  (0) 2013.06.06
crontab 시간 설정방법  (0) 2013.05.24

설정

트랙백

댓글