nohup 실행파일 1> /dev/null 2>&1

 

실제적인 설명은 마지막에 드리고

먼저 I/O 재지향에 대한 개념을 소개합니다.

 

I/O 재지향

 

ls > ls_result.txt

위와 같이 하면 화면에 출력될  ls 의 결과가 ls_result.txt 라는 파일 속에 기록이 됩니다.

 

화면에 출력될 내용을 표준출력(stdout)이라고 하는데,

파일디스크립터(file descriptor)  번호는 1번입니다.

(표준입력, 표준출력, 표준에러에 해당하는 파일 디스크립터는 각각 0, 1, 2 입니다.)

 

ls 1> ls_result.txt 라고 해도 결과가 같습니다.

 

ls > /dev/null 은 ls 의 결과를 /dev/null 이라는 파일 속에 넣습니다.

/dev/null 은 특수한 장치파일로 모든 입력을 (마치 블랙홀 마냥) 없애버립니다.

 

1> /dev/null 

그러므로 위의 표현은 표준출력을 /dev/null로 재지향합니다.

 

2>&1 

이 표현은 1번 파일디스크립터에 2번 파일디스크립터(stderr) 를 재지향 합니다.

1번 파일디스크립터는 바로 전에 /dev/null 로 재지향되었기 때문에

2번 파일디스크립터를 1번 파일디스크립터로 재지향하는 것은

2번 파일디스크립터를 /dev/null 로 재지향하는 것과 동일합니다.

 

&  

마지막의 & 는 실행 작업을 background 로 보내는 역할을 합니다.

 

그러므로,

nohup 실행파일 1> /dev/null 2>&1

위 명령은

실행파일을 백그라운드 모드로 실행을 하면서

로그아웃 후에도 프로세스가 죽지 않고 진행되도록 하는데,

실행파일에 의해 발생되는 출력(에러 메시지까지)을 화면에 보이지 않게끔 합니다.

 

nohup 명령은 실행을 하면 nohup.out 이라는 이름의 파일이 생성됩니다.

이 파일에는 nohup 으로 실행하는 명령의 출력이 기록이 되는데

위의 명령을 이용하면 nohup.out 에는 아무런 기록이 남지 않습니다.


'OS > LINUX' 카테고리의 다른 글

/etc/sysconfig / 시스템 설정 정보  (0) 2011.06.16
IPTABLES 사용법 예제로 정리  (0) 2011.06.16
iptables 관련  (0) 2011.06.16
원격 시스템 사용자 계정 정보 확인 - finger  (0) 2011.06.14
php memcached 설치 & 연동  (0) 2011.06.09

# mknod /dev/null  c  2  2
퍼미션을 644 -> 666으로 변경(?)

'OS > LINUX' 카테고리의 다른 글

데몬의 종류, /etc/rc.d/init.d/  (0) 2011.06.09
[/etc/rc.d/init.d/*] 데몬 실행 스크립트의 이해  (0) 2011.06.09
/dev/zero와 /dev/null  (0) 2011.06.04
Perl 입문  (0) 2011.05.17
프로세스 - fork & exec  (0) 2011.05.14

/dev/zero/dev/null

/dev/null의 쓰임새

/dev/null"블랙홀"이라고 상상해 보세요. 이 파일은 거의 읽기 전용 파일이나 마찬가집니다. 이 파일에 쓰는 모든것은 영원히 사라져 버릴겁니다. 이 파일에서 무언가를 읽으려고 하거나 어떤 결과를 바라는 것은 무의미한 일입니다. 그럼에도 불구하고, /dev/null은 명령어 줄이나 스크립트에서 아주 유용하게 쓸 수 있습니다.

표준출력이나 표준에러 막기(예 30-1에서 인용):

rm $badname 2>/dev/null
#           에러 메세지[stderr]는 완전히 사라져 버립니다.

파일 자체와 모든 퍼미션은 그대로 가지면서 내용만 지우기(예 2-1예 2-2에서 인용):

cat /dev/null > /var/log/messages
#  : > /var/log/messages   라고 해도 같지만, 이렇게 하면 새 프로세스를 띄우지 않습니다.

cat /dev/null > /var/log/wtmp

로그 파일의 내용을 자동으로 비우기(상용 웹 사이트에서 보내는 귀찮은 "쿠키"를 처리할 때 특별히 좋습니다):

예 29-1. 쿠키 항아리를 숨기기

if [ -f ~/.netscape/cookies ]  # 있다면 지우고,
then
  rm -f ~/.netscape/cookies
fi

ln -s /dev/null ~/.netscape/cookies
# 이제 모든 쿠키는 디스크에 저장되지 않고 블랙홀로 보내집니다.
/dev/zero의 쓰임새

/dev/zero/dev/null처럼 가상 파일(pseudo file)이지만, 실제로 널 값을 갖고 있습니다(아스키 문자 0이 아닌 숫자 0). 이 파일에 무언가를 쓰면 그 출력은 사라집니다. 이 파일에서 널 값을 읽어 내는 것은 아주 어렵습니다만 od 명령어나 헥사 에디터로 할 수는 있습니다. /dev/zero는 특정한 길이의 초기화된 더미 파일을 임시 스왑 파일로 만드는데 주로 쓰입니다.

예 29-2. /dev/zero로 스왑 파일 세팅하기

#!/bin/bash

# 스왑 파일 만들기.
# 루트로 실행시키세요.

ROOT_UID=0         # 루트 $UID 는 0.
E_WRONG_USER=65    # 루트가 아님.

FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0

if [ "$UID" -ne "$ROOT_UID" ]
then
  echo; echo "이 스크립트는 루트만 실행시킬 수 있습니다."; echo
  exit $E_WRONG_USER
fi  
  

if [ -n "$1" ]
then
  blocks=$1
else
  blocks=$MINBLOCKS              # 명령어줄에서 지정해 주지 않으면 
fi                               # 40 블럭을 기본값으로 세트.

if [ "$blocks" -lt $MINBLOCKS ]
then
  blocks=$MINBLOCKS              # 최소 40 블럭이어야 됩니다.
fi  


echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks  # Zero out file.

mkswap $FILE $blocks             # Designate it a swap file.
swapon $FILE                     # Activate swap file.

echo "Swap file created and activated."

exit $SUCCESS

/dev/zero의 다른 응용으로는, 파일이 0으로만 이루어진 지정된 크기를 갖게 하는 것인데, 루프백 디바이스를 마운트 하는 등의 특별한 목적을 위해 쓰입니다. 예 13-6예 12-33를 참고하세요.

예 29-3. 램디스크 만들기

#!/bin/bash
# ramdisk.sh

#  "ramdisk" 란 시스템의 RAM 의 일정 부분(segment)을 
#+ 파일시스템처럼 쓰는 것을 말합니다.
#  램디스크의 장점은 읽고/쓰기가 아주 빠르다는데 있습니다.
#  단점: 휘발성이 있기 때문에 시스템이 리부트되거나 꺼지면 그 내용을 잃어버립니다.
#        램디스크로 할당한 만큼의 메모리를 못 쓰게 됩니다.
#
#  램디스크가 뭐가 좋을까요?
#  테이블이나 사전처럼 아주 큰 데이타를 램디스크에 올려 놓으면
#+ 디스크 접근 속도보다 메모리 접근 속도가 훨씬 빠르기 때문에 데이타 탐색 속도가 빨라집니다.


E_NON_ROOT_USER=70             # 루트로 실행.
ROOTUSER_NAME=root

MOUNTPT=/mnt/ramdisk
SIZE=2000                      # 2K 블럭(필요에 따라 수정)
BLOCKSIZE=1024                 # 1K (1024 byte) 블럭 크기
DEVICE=/dev/ram0               # 첫번째 램 디바이스

username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ]
then
  echo "\"`basename $0`\" 는 루트로 실행시켜야 됩니다."
  exit $E_NON_ROOT_USER
fi

if [ ! -d "$MOUNTPT" ]         #  마운트 포인트가 존재하는지 확인해서
then                           #+ 이 스크립트를 여러번 실행시켜도 에러가 나지 않도록 함.
  mkdir $MOUNTPT              
fi

dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE  # 램 디바이스 초기화(zero out).
mke2fs $DEVICE                 # 램 디스크에 ext2 파일시스템을 만들고,
mount $DEVICE $MOUNTPT         # 마운트.
chmod 777 $MOUNTPT             # 일반 사용자도 접근 가능하게.
                               # 하지만 언마운트는 루트만.

echo "이제 \"$MOUNTPT\" 를 쓸 수 있습니다."
# 이제부터는 일반사용자까지도 램디스크에 파일을 저장할 수 있습니다.

#  주의할 점은 램디스크가 휘발성을 갖기 때문에 리부트나 전원이 꺼질 때에는
#+ 그 내용이 없어집니다. 
#  저장하고 싶은 것이 있다면 램디스크가 아닌 일반 디렉토리로 복사해서 쓰면 됩니다.

# 리부트후에 램디스크를 다시 셋업하고 싶다면 이 스크립트를 실행시키면 됩니다.
#  /mnt/ramdisk 를 이 스크립트를 통하지 않고 
#+ 다른 방법으로 다시 마운트하려고 한다면 제대로 동작하지 않을 것입니다.

exit 0

'OS > LINUX' 카테고리의 다른 글

[/etc/rc.d/init.d/*] 데몬 실행 스크립트의 이해  (0) 2011.06.09
/dev/null 다시 만들기  (0) 2011.06.04
Perl 입문  (0) 2011.05.17
프로세스 - fork & exec  (0) 2011.05.14
쉘 스크립트 #6  (0) 2011.05.14

+ Recent posts