개요

 

nohup 명령어는 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작 할 수 있게 해주는 명령어입니다.


기본적으로 터미널에서 세션 로그아웃(logout)이 발생하면

리눅스는 해당 터미널에서 실행한 프로세스들에게 HUP signal 이 전달하여 종료시키게 되는데,

이 HUP signal을 프로세스가 무시(ignore)하도록 하는 명령어라서 nohup 이라는 이름인 것입니다. 

 

그래서 결과적으로 터미널에서 연결이 끊기거나 터미널을 종료해도 실행했던 프로세스들이 계속 실행될 수 있는 것입니다.

 

또한 nohup 명령어는 표준 출력(standard output)nohup.out 파일로 재지향(redirection) 합니다.

 

터미널이 종료되어도 표준 출력은 nohup.out 파일에 계속해서 기록되기 때문에 프로세스의 상태를 확인하는데 유용 할 수 있습니다.

그러나 필요 이상의 로그를 화면에 계속해서 출력하게 되면 nohup.out 파일의 용량이 매우 커지기 때문에  디스크 공간을 낭비하게 될 수 있습니다.

 

따라서 꼭 필요한 로그만 출력하거나 로그를 남기는 것이 불필요한 경우 재지향을 통해 nohup.out 파일을 생성하지 않도록 하는 것이 좋습니다. 

 

 

 

사용법

 

nohup 명령어의 사용법은 매우 단순합니다. 

 

nohup [프로세스] &

 

[프로세스] 부분에 실행하고자 하는 프로그램이나 스크립트를 지정하면 됩니다.

여러분이 작성한 스크립트를 넣어도 되는데 스크립트 파일의 권한이 755 이상이어야 합니다.

 

일반적으로 nohup 명령어를 사용할 때는 백그라운드 작업으로 실행하는 경우가 많기 때문에 뒤에 & 를 붙여서 백그라운드 실행이라는 것을 명시해 줍니다.

 

nohup.out 파일을 생성하지 않으려면 표준출력과 표준에러를 /dev/null 로 재지향 해주면 됩니다. 

nohup [프로세스] 1>/dev/null 2>&1 &

 

1>/dev/null 은 표준 출력을 사용하지 않겠다는 의미이고, 2>&1 은 표준 에러를 표준 출력과 같게 만드는 명령어입니다. 

 

nohup 으로 실행한 프로세스를 종료하려면 먼저 ps 명령어로 PID를 식별한 다음,

kill 명령어를 사용하여 해당 프로세스에 종료 시그널을 보내서 종료해야 합니다. 

 

ps -ef | grep [프로세스명]

# PID 식별 후
kill -15 [PID]

# 종료되지 않으면 강제 종료 (비권장)
kill -9 [PID]

 

 

위에서 사용된 재지향, kill, ps 명령어 등은 아래 글들을 참고해주세요.

 

[Linux] 재지향(Redirection)에 대한 이해

안녕하세요 피터입니다. 오늘은 리눅스의 I/O 재지향(redirection)에 대해서 설명드리겠습니다. 재지향은 파이프(pipe)와 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심

gracefulprograming.tistory.com

 

[Linux] kill 프로세스를 '안전하게' 종료시켜보자

개요 kill 명령어는 이름 때문에 프로세스를 강제로 종료시키는 명령어로 오해를 사기 쉬운데 실제로는 프로세스에 시그널(signal)을 보내는 명령어입니다. 이름이 kill 인 이유는 어떤 시그널을 보

gracefulprograming.tistory.com

 

 

[Linux] ps 로 실행 중인 프로세스 확인하기

개요 ps 명령어는 리눅스에서 현재 실행중인 프로세스를 확인하는 명령어 입니다. Process Status에서 따온 이름이죠. 이름 그대로 명령어를 실행하면 현재 실행되고 있는 프로세스들의 정보를 화면

gracefulprograming.tistory.com

 

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

kill 명령어는 이름 때문에 프로세스를 강제로 종료시키는 명령어로 오해를 사기 쉬운데 실제로는 프로세스에 시그널(signal)을 보내는 명령어입니다. 

이름이 kill 인 이유는 어떤 시그널을 보낼 지 지정하지 않으면 기본적으로 SIGTERM 시그널을 보내게 되는데 SIGTERM의 기본 동작이 프로그램 종료이기 때문입니다. 

 

물론 프로세스에 SIGKILL 시그널을 보내 강제로 종료시킬 수도 있습니다. 

그렇지만 일반적인 상황에서 SIGKILL 시그널을 보내는 것은 권장되지 않습니다. 

 

본래 프로그램을 설계 할 때 대부분의 경우 종료 시그널을 받았을 때 처리하고 있던 데이터가 안전하게 정리 될 수 있도록 설계합니다. 

SIGTERM, SIGINT 등의 종료 시그널에 대해 시그널 핸들러(handler)를 등록하여 시그널이 수신되었을 때 연결된 Socket 또는 File을 close 하거나 Queue에 적재된 데이터를 File로 Dump하기도 합니다. 

처리 중이던 데이터를 안전하게 정리/보관하여 데이터 유실을 방지하고 다시 실행하였을 때 기존 작업을 이어나갈 수 있게 하기 위함입니다. 

그런데 SIGKILL 시그널은 프로그램에서 핸들러를 만들 수 없는 시그널이기 때문에 위와 같은 처리들을 구현 할 수 없습니다. 따라서 SIGKILL 시그널을 통해 프로세스를 강제로 종료해버리면 데이터 유실과 같은 문제가 생길 우려가 있습니다. 

 

kill -KILL PID

or

kill -9 PID

프로세스를 안전하게 종료시키려면 위와 같이 SIGKILL을 통한 종료는 가급적 사용하지 않는게 좋습니다. 

 

 

시그널(signal)

 

[root@peterdev dev]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

kill 명령어에 -l 옵션을 주면 위와 같이 시그널의 숫자(number)와 이름이 출력됩니다. 

 

시그널을 보낼 때는 kill -(보낼 시그널) PID 이렇게 사용하는데, 지정된 PID를 갖는 프로세스에 지정된 시그널이 전달되는 구조입니다. 

 

시그널은 숫자로 지정해도 되고 앞에 SIG를 빼고 이름을 넣어도 됩니다. 

kill -INT PID

or

kill -2 PID

 

위에서 언급한 대로 아무런 시그널을 지정하지 않고 kill PID 이라고만 하면 SIGTERM 이 전달됩니다. 

 

 

특정 이름의 프로세스 모두 종료하기

 

kill `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'`

 

파이프grep, awk, 역따옴표(backticks : 백틱)을 조합하면 특정 이름의 프로세스를 모두 찾아서 종료 시킬 수 있습니다. 

 

파이프와 grep은 리눅스에서 가장 많이 사용되는 명령어 조합 중에 하나로 이전 스트림의 출력값에 원하는 형식으로 필터링을 할 수 있습니다. 

위 스크립트에서 프로세스이름 부분에 와일드카드 문자나 정규표현식도 사용 가능합니다. 

 

grep -v 은 지정된 패턴과 일치하는 항목을 제외할 때 사용합니다.

여기서는 "grep 프로세스이름" 도 하나의 명령어기 때문에 "ps -ef | grep 프로세스이름" 의 결과에 포함되는데 kill 명령어에서 이를 제외시키기 위함입니다.

 

awk 명령어는 입력 값(record : 레코드)을 공백 문자로 분리하여 필드(field) 단위로 처리 할 수 있게 해주는 명령어입니다. 

여기서는 ps -ef 명령어의 결과에서 PID를 추출하기 위해 사용됩니다. 

 

마지막으로 `명령어` 백틱(backticks)은 치환 명령어라고도 하는데 ` ` 로 감싼 부분의 실행 결과로 치환됩니다. 

 

결과적으로 kill `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'` 에서 `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'` 부분이 실행된 결과로 치환되어 kill PID 형태로 실행이 되는 것입니다. 

 

 

참고

 

 

[Linux] 파이프(pipe)에 대한 이해

안녕하세요 피터입니다. 오늘은 리눅스의 파이프(pipe)에 대해서 설명드리겠습니다. 파이프는 재지향(redirection)과 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심 기�

gracefulprograming.tistory.com

 

[Linux] ps 로 실행 중인 프로세스 확인하기

개요 ps 명령어는 리눅스에서 현재 실행중인 프로세스를 확인하는 명령어 입니다. Process Status에서 따온 이름이죠. 이름 그대로 명령어를 실행하면 현재 실행되고 있는 프로세스들의 정보를 화면

gracefulprograming.tistory.com

 

-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

개요

 

ps 명령어는 리눅스에서 현재 실행중인 프로세스를 확인하는 명령어 입니다.

 

Process Status에서 따온 이름이죠. 이름 그대로 명령어를 실행하면 현재 실행되고 있는 프로세스들의 정보를 화면에 출력합니다. 

 

윈도우에서 특정 프로세스가 실행 중인지 확인하거나 강제 종료하기 위해 작업 관리자를 사용하듯이 리눅스에서는 ps 명령어가 자주 사용됩니다.

특히 GUI를 사용하지 않는 서버 환경에서는 대부분의 프로세스들이 백그라운드에서 동작하기 때문에 특정 프로세스가 동작 중인지 확인하기 위해서 많이 쓰입니다. 

 

bash 스크립트(script)를 통한 자동화에도 ps 명령어가 자주 사용되는데요. 

주로 특정 프로세스에 시그널(signal)을 보내야 할 때 PID(process id)를 식별하기 위해서 쓰이기도 하고, 프로세스가 중단되면 다시 실행시키기 위해 감시하는 목적으로 쓰이기도 합니다. 

 

사용법

ps --help all

shell에서 위와 같이 help 명령어를 실행하면 ps 명령어에 대한 자세한 도움말을 볼 수 있습니다. 

Usage:
 ps [options]

Basic options:
 -A, -e               all processes
 -a                   all with tty, except session leaders
  a                   all with tty, including other users
 -d                   all except session leaders
 -N, --deselect       negate selection
  r                   only running processes
  T                   all processes on this terminal
  x                   processes without controlling ttys

Selection by list:
 -C <command>         command name
 -G, --Group <GID>    real group id or name
 -g, --group <group>  session or effective group name
 -p, p, --pid <PID>   process id
        --ppid <PID>  parent process id
 -q, q, --quick-pid <PID>
                      process id (quick mode)
 -s, --sid <session>  session id
 -t, t, --tty <tty>   terminal
 -u, U, --user <UID>  effective user id or name
 -U, --User <UID>     real user id or name

  The selection options take as their argument either:
    a comma-separated list e.g. '-u root,nobody' or
    a blank-separated list e.g. '-p 123 4567'

Output formats:
 -F                   extra full
 -f                   full-format, including command lines
  f, --forest         ascii art process tree
 -H                   show process hierarchy
 -j                   jobs format
  j                   BSD job control format
 -l                   long format
  l                   BSD long format
 -M, Z                add security data (for SELinux)
 -O <format>          preloaded with default columns
  O <format>          as -O, with BSD personality
 -o, o, --format <format>
                      user-defined format
  s                   signal format
  u                   user-oriented format
  v                   virtual memory format
  X                   register format
 -y                   do not show flags, show rss vs. addr (used with -l)
     --context        display security context (for SELinux)
     --headers        repeat header lines, one per page
     --no-headers     do not print header at all
     --cols, --columns, --width <num>
                      set screen width
     --rows, --lines <num>
                      set screen height

Show threads:
  H                   as if they were processes
 -L                   possibly with LWP and NLWP columns
 -m, m                after processes
 -T                   possibly with SPID column

Miscellaneous options:
 -c                   show scheduling class with -l option
  c                   show true command name
  e                   show the environment after command
  k,    --sort        specify sort order as: [+|-]key[,[+|-]key[,...]]
  L                   show format specifiers
  n                   display numeric uid and wchan
  S,    --cumulative  include some dead child process data
 -y                   do not show flags, show rss (only with -l)
 -V, V, --version     display version information and exit
 -w, w                unlimited output width

        --help <simple|list|output|threads|misc|all>
                      display help and exit

 

가장 흔하게 사용되는 옵션은 -e-f 옵션입니다. 

-e 옵션은 전체 프로세스를 보겠다는 옵션인데 이 옵션을 사용하지 않으면 현재 로그인된 shell에서 실행 중인 프로세스만 표시되기 때문에 대부분의 경우 -e 옵션을 사용합니다. 

-A 로도 동일하게 사용 가능하지만 대문자 A보다는 소문자 e가 사용하기 좀 더 편합니다.

[root@peterdev ~]# ps
  PID TTY          TIME CMD
  756 pts/0    00:00:00 ps
23316 pts/0    00:00:01 bash
28992 pts/0    00:00:00 bash

 

[root@peterdev ~]# ps -e
  PID TTY          TIME CMD
    1 ?        01:16:34 systemd
    2 ?        00:00:14 kthreadd
    3 ?        00:01:10 ksoftirqd/0
    5 ?        00:00:00 kworker/0:0H
    7 ?        00:00:00 migration/0
    8 ?        00:00:00 rcu_bh

...
...
...

 4982 ?        00:02:04 python
31680 ?        00:01:10 qmgr
32662 ?        00:00:00 pickup

 

-f 옵션은 프로세스의 상태 정보를 모두(full) 표시하겠다는 옵션입니다. 

[root@peterdev ~]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root       773 28992  0 15:51 pts/0    00:00:00 ps -f
root     23316 23302  0  2018 pts/0    00:00:01 /bin/bash
root     28992 28988  0 08:25 pts/0    00:00:00 -bash

프로세스를 실행한 UIDPID, 그리고 부모 프로세스의 ID(PPID)도 표시되며, 프로세스를 실행할 당시의 커맨드라인(command-line)도 표시 되기 때문에 자주 사용됩니다. 

같은 이름의 프로세스가 여러 개 실행 중일 때는 커맨드 라인으로 프로세스를 구분해야 하기 때문입니다. (nginx 같은 경우)

여러 개의 옵션을 함께 사용할 때는 - 기호는 한번만 써도 됩니다.

[root@peterdev ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2018 ?        01:16:34 /usr/lib/systemd/systemd --system --deserialize 21
root         2     0  0  2018 ?        00:00:14 [kthreadd]
root         3     2  0  2018 ?        00:01:10 [ksoftirqd/0]
root         5     2  0  2018 ?        00:00:00 [kworker/0:0H]
root         7     2  0  2018 ?        00:00:00 [migration/0]

 

-u 옵션을 사용하면 특정 사용자 계정(UID)으로 실행되고 있는 프로세스만 볼 수 있습니다. 

[root@localhost ~]# ps -fu node_manager
UID         PID   PPID  C STIME TTY          TIME CMD
node_ma+ 183483      1  0  8월04 ?      00:09:22 java -jar -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m node_manager-0.0.1-SNAP
node_ma+ 199085 199067  0  8월03 ?      00:00:00 sshd: node_manager@pts/3
node_ma+ 199086 199085  0  8월03 pts/3  00:00:00 -bash

 

 

예제

ps -ef 명령어를 실행해보시면 아시겠지만 결과가 굉장히 많이 출력됩니다. 

당연하게도 전체 프로세스 정보를 출력하는 것이니 많을 수밖에요. 이렇다 보니 내가 확인하려고 하는 프로세스를 찾기 위해서는 뭔가 방법이 필요해 보입니다. 

이전 포스팅에서 파이프(pipe)에 대해서 설명드린 적이 있는데요, 바로 지금이 파이프를 활용할 때입니다. 

[Linux] 파이프(pipe)에 대한 이해

 

만일 내가 찾고자 하는 프로세스 이름에 python 이라는 문자열이 들어간다고 하면 아래와 같이 찾을 수 있습니다. 

[root@peterdev ~]# ps -ef | grep python
root       477     1  0  2018 ?        00:00:47 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
root       819     1  0  2018 ?        03:10:37 /usr/bin/python -Es /usr/sbin/tuned -l -P
root       847 28992  0 16:01 pts/0    00:00:00 grep --color=auto python
root      4982  4956  0  2019 ?        00:02:04 python ./get_pr.py
root     28692     1  0  2019 ?        00:00:00 python app.py

이처럼 python 프로세스가 여러 개 실행 중인걸 확인 할 수 있는데요, 커맨드라인을 통해 어떤 스크립트를 실행하고 있는지 구별이 가능합니다.

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

 

안녕하세요 피터입니다.

오늘은 리눅스(linux)에서 하이픈(-)으로 시작하는 파일을 처리하는 방법에 대해서 알려드리겠습니다.

간혹 명렁어나 스크립트를 잘못 사용하면 하이픈으로 시작하는 파일이 생성되는 경우가 있습니다. 

리눅스에서 하이픈은 명령어에서 옵션을 지정 할 때 사용되기 때문에 파일명이 하이픈으로 시작하면 shell 에서 다루기가 쉽지 않습니다.  

일반적인 쉘의 쿼우팅(Quotiong) 방법으로 처리하려 하면 아래와 같이 잘못된 옵션이라는 에러 메시지를 보게 될 확율이 높습니다.

 

[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:48 -d
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]# clear
[root@peterdev dummy]# rm -f '-d'
[root@peterdev dummy]# rm -f "-d"
[root@peterdev dummy]# mv "-d" dst
mv: invalid option -- 'd'
Try 'mv --help' for more information.
[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:48 -d
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt

rm 또는 mv 명령어에 파일명을 ' 또는 " 로 쿼우팅을 해도 하이픈으로 시작하는 파일은 제대로 처리가 되지 않습니다. 

 

해결방법

이런 경우에는 하이픈 두개(--)를 추가해서 해결할 수 있습니다. 

[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:48 -d
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]# rm -f -- -d
[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]#

 

rm -f 명령어 다음에 -- 를 추가하면 바로 뒤에 하이픈으로 시작하는 파일명을 정상적으로 인식합니다. 

-- 는 - 를 특수한 의미를 갖는 기호가 아닌 일반 문자로 취급하라는 의미이기 때문입니다. 

 

마찬가지로 mv 명령어에도 -- 를 사용하면 정상적으로 처리 됩니다. 

[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]# mv -- -s_test.txt test.txt
[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 test.txt
[root@peterdev dummy]#

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

개요

tail 명령어는 리눅스에서 파일의 내용을 출력하는 기능을 수행합니다.

cat 명령어와 다른점은 cat은 파일 전체의 내용을 출력하는 데 비해 tail 명령어는 파일의 맨 끝에서부터 지정된 라인 만큼 출력해줍니다.

또한 -f 옵션을 이용해서 실시간으로 파일에 추가된 내용을 출력할 수 있습니다.


tail 명령어와 유사한 명령어로는 head 명령어가 있습니다. head 명령어는 맨 앞에서부터 지정된 라인 만큼 출력해줍니다.


사용법

리눅스에서 사용되는 명령어는 모두 대소문자를 구분하니 주의해주세요.

tail 명령어에 대한 자세한 설명은 tail --help 명령어를 통해 볼 수 있습니다.


Usage: tail [OPTION]... [FILE]...
Print the last 10 lines of each FILE to standard output.


With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -c, --bytes=K            output the last K bytes; or use -c +K to output
                             bytes starting with the Kth of each file
  -f, --follow[={name|descriptor}]
                           output appended data as the file grows;
                             an absent option argument means 'descriptor'
  -F                       same as --follow=name --retry
  -n, --lines=K            output the last K lines, instead of the last 10;
                             or use -n +K to output starting with the Kth
      --max-unchanged-stats=N
                           with --follow=name, reopen a FILE which has not
                             changed size after N (default 5) iterations
                             to see if it has been unlinked or renamed
                             (this is the usual case of rotated log files);
                             with inotify, this option is rarely useful
      --pid=PID            with -f, terminate after process ID, PID dies
  -q, --quiet, --silent    never output headers giving file names
      --retry              keep trying to open a file if it is inaccessible
  -s, --sleep-interval=N   with -f, sleep for approximately N seconds
                             (default 1.0) between iterations;
                             with inotify and --pid=P, check process P at
                             least once every N seconds
  -v, --verbose            always output headers giving file names
      --help     display this help and exit
      --version  output version information and exit

If the first character of K (the number of bytes or lines) is a '+',
print beginning with the Kth item from the start of each file, otherwise,
print the last K items in the file.  K may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

With --follow (-f), tail defaults to following the file descriptor, which
means that even if a tail'ed file is renamed, tail will continue to track
its end.  This default behavior is not desirable when you really want to
track the actual name of the file, not the file descriptor (e.g., log
rotation).  Use --follow=name in that case.  That causes tail to track the
named file in a way that accommodates renaming, removal and creation.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'tail invocation'


-n 옵션으로 출력할 라인 수를 지정할 수 있습니다.


-f 옵션을 지정하면 파일에 변경을 실시간으로 감지하여 추가된 내용을 출력해주기 때문에 실시간으로 로그 파일 모니터링 하는데 유용합니다.


tail 명령어도 cat 명령어와 마찬가지로 단독으로도 쓰임새가 많지만 파이프재지향을 사용하여 연계할 경우 매우 강력한 기능이 되기 때문에 아래 글을 참고해서 기억해두시기 바랍니다.

[Linux] 파이프(pipe)에 대한 이해

[Linux] 재지향(Redirection)에 대한 이해



예제

ex) 파일의 뒤에서부터 10라인만 출력

[root@peterdev test]# tail -n 10 index.html
window.addEventListener("load", function() { loadJS(); }, true);
} else if (window.attachEvent) {
window.attachEvent("onload", loadJS);
} else {
window.onload = loadJS;
}

</script>
</body>
</html>

ex) /var/log/message 로그 파일을 실시간으로 감시

[root@peterdev test]# tail -f /var/log/messages
Jun 26 13:01:01 peterdev systemd: Started Session 1688 of user root.
Jun 26 13:01:01 peterdev systemd: Starting Session 1688 of user root.
Jun 26 13:04:34 peterdev systemd: Started Session 1689 of user root.
Jun 26 13:04:34 peterdev systemd-logind: New session 1689 of user root.
Jun 26 13:04:34 peterdev systemd: Starting Session 1689 of user root.
Jun 26 14:01:01 peterdev systemd: Started Session 1690 of user root.
Jun 26 14:01:01 peterdev systemd: Starting Session 1690 of user root.
Jun 26 15:01:01 peterdev systemd: Started Session 1691 of user root.




-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

개요

cat 명령어는 리눅스에서 파일의 내용을 출력하는 기능을 수행합니다.


사용법

리눅스에서 사용되는 명령어는 모두 대소문자를 구분하니 주의해주세요.

cat 명령어에 대한 자세한 설명은 cat --help 명령어를 통해 볼 수 있습니다.


Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s), or standard input, to standard output.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
  -s, --squeeze-blank      suppress repeated empty output lines
  -t                       equivalent to -vT
  -T, --show-tabs          display TAB characters as ^I
  -u                       (ignored)
  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
      --help     display this help and exit
      --version  output version information and exit

With no FILE, or when FILE is -, read standard input.

Examples:
  cat f - g  Output f's contents, then standard input, then g's contents.
  cat        Copy standard input to standard output.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'cat invocation'


기본적인 사용법은 cat 명령어 뒤에 파일명을 입력하면 해당 파일의 내용을 표준출력으로 출력합니다.


cat filename

[root@peterdev test]# cat test1.txt
abc
def
qwe
poi
abc
abcdef
abcd

cat이나 tail, head 등의 명령어는 파이프(pipe) 를 통해 다른 명령어듣과 연계하거나 재지향(redirect)을 이용하여 다른 파일에 저장할 수 있습니다.


단독으로도 쓰임새가 많지만 이렇게 연계할 경우 매우 강력한 기능이 되니 아래 글들을 참고하셔서 꼭 기억해두시기 바랍니다.

[Linux] 파이프(pipe)에 대한 이해

[Linux] 재지향(Redirection)에 대한 이해




예제

ex) 리눅스 시스템 계정 목록 출력

[root@peterdev ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin


ex) 줄번호와 같이 출력

[root@peterdev test]# cat -n arr.c
1 #include<stdio.h>
2
3 int main(void)
4 {
5 int score[5];
6 scanf("%d", &score[0]);
7 scanf("%d", &score[1]);
8 scanf("%d", &score[2]);
9 scanf("%d", &score[3]);
10 scanf("%d", &score[4]);
11
12 printf("%dst score is %d\n", 1, score[0]);
13 printf("%dst score is %d\n", 2, score[1]);
14 printf("%dst score is %d\n", 3, score[2]);
15 printf("%dst score is %d\n", 4, score[3]);
16 printf("%dst score is %d\n", 5, score[4]);
17
18 return 0;
19 }

-n 옵션을 사용하면 줄번호와 같이 출력할 수 있습니다.


ex) 한페이지 씩 출력

[root@peterdev ~]# cat /var/log/messages | more
Jun 17 03:27:02 peterdev rsyslogd: [origin software="rsyslogd" swVersion="8.24.0
" x-pid="432" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Jun 17 04:01:01 peterdev systemd: Started Session 1462 of user root.
Jun 17 04:01:01 peterdev systemd: Starting Session 1462 of user root.
Jun 17 05:01:01 peterdev systemd: Started Session 1463 of user root.
Jun 17 05:01:01 peterdev systemd: Starting Session 1463 of user root.
Jun 17 05:48:22 peterdev chronyd[456]: Selected source 122.215.240.52
Jun 17 06:01:01 peterdev systemd: Started Session 1464 of user root.
Jun 17 06:01:01 peterdev systemd: Starting Session 1464 of user root.
Jun 17 07:01:01 peterdev systemd: Started Session 1465 of user root.
Jun 17 07:01:01 peterdev systemd: Starting Session 1465 of user root.
Jun 17 08:01:01 peterdev systemd: Started Session 1466 of user root.
Jun 17 08:01:01 peterdev systemd: Starting Session 1466 of user root.
Jun 17 09:01:01 peterdev systemd: Started Session 1467 of user root.
Jun 17 09:01:01 peterdev systemd: Starting Session 1467 of user root.
Jun 17 10:01:01 peterdev systemd: Started Session 1468 of user root.
Jun 17 10:01:01 peterdev systemd: Starting Session 1468 of user root.
Jun 17 11:01:01 peterdev systemd: Started Session 1469 of user root.
Jun 17 11:01:01 peterdev systemd: Starting Session 1469 of user root.
Jun 17 12:01:01 peterdev systemd: Started Session 1470 of user root.
Jun 17 12:01:01 peterdev systemd: Starting Session 1470 of user root.
Jun 17 12:39:28 peterdev dhclient[757]: DHCPREQUEST on eth0 to 169.254.169.254 p
ort 67 (xid=0x5f254c90)
--More--
more 명령어를 파이프로 연결해서 사용하면 한페이지 씩 출력할 수 있습니다.

ex) 파일 복사

[root@peterdev test]# cat test.c > copy.c

cat 명령어의 출력을 다른 파일로 재지향하면 파일을 복사할 수 있습니다.




-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

안녕하세요 피터입니다.

오늘은 리눅스의 I/O 재지향(redirection)에 대해서 설명드리겠습니다.

재지향파이프(pipe)와 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심 기능입니다.

마치 그 자체로는 특별한 맛이 나지 않지만 단맛이나 짠맛 같은 다른 맛을 훨씬 강하게 만들어주는 조미료와 같다고 할까요?


파이프는 아래 글에서 자세히 보실 수 있습니다.

개요

리눅스 쉘은 항상 아래와 같이 표준 입출력파일 형태로 열고 있습니다.
  • 표준입력(stdin: 키보드)
  • 표준출력(stdout: 모니터)
  • 표준에러(stderr: 모니터)


기본적으로 프로그램은 연산 결과를 출력 장치(파일, 모니터, 프린터 등)로 내보내는데요. 이 출력되는 데이터를 임의로 다른 장치로 보내는 것을 재지향(redirection)이라고 합니다.


다시 말하면 파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내는 것을 말합니다.


사용법

표준 입출력은 파일 형태로 열려 있다고 말씀드렸는데요. 리눅스에서 열려 있는 파일은 파일 디스크립터(file descriptor)를 할당 받게 됩니다.

  • 표준 입력(stdin) = 0
  • 표준 출력(stdout) = 1
  • 표준 에러(stderr) = 2

이렇게 0, 1, 2파일 디스크립터를 할당받기 때문에 이를 이용해서 재지향을 할 수 있습니다.



> file
표준 출력을 파일로 재지향 합니다. 파일이 없으면 새로 만들고, 파일이 있으면 덮어씁니다.

>> file
표준 출력을 파일로 재지향 합니다. 파일이 없으면 새로 만들고, 파일이 있으면 파일의 끝에 덧붙입니다.

2>&1
표준 에러를 표준 출력으로 재지향합니다. 표준 에러도 표준 출력의 자격으로 보내집니다.

< file
파일로부터 표준 입력을 받도록 재지향합니다.


예제

ex) test.txt 파일의 출력을 test.out 파일로 저장

cat test.txt > test.out

ex) today.log 파일의 출력을 week.log 파일의 끝에 덧붙임

cat today.log >> week.log


ex) cat 명령어의 에러를 표준 출력으로 재지향하고 표준 출력을 out 파일로 재지향

[root@peterdev test]# cat nofile > out 2>&1
[root@peterdev test]# cat out
cat: nofile: No such file or directory

에러가 표준 출력으로 재지향 되었기 때문에 화면에 에러가 출력되는 대신에 out 파일에 기록됩니다.


ex) ls 명령어의 에러를 /dev/null 로 재지향

[root@peterdev test]# ls -xy 2> /dev/null
[root@peterdev test]#

/dev/null 은 특수 파일로 이 파일로 출력된 데이터는 버려집니다.

ls 명령에 xy 라는 잘못된 옵션을 입력하여 에러가 발생하였지만, /dev/null 로 재지향하여 출력을 없애버렸습니다.



 

-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요


개요


chmod 명령어는 리눅스의 파일이나 디렉토리의 권한을 변경하는 명령어입니다.



사용법

리눅스에서 사용되는 명령어는 모두 대소문자를 구분하니 주의해주세요.

chmod 명령어의 사용법은 다음과 같습니다.


Usage: chmod [OPTION]... MODE[,MODE]... FILE...
  or:  chmod [OPTION]... OCTAL-MODE FILE...
  or:  chmod [OPTION]... --reference=RFILE FILE...
Change the mode of each FILE to MODE.
With --reference, change the mode of each FILE to that of RFILE.

  -c, --changes          like verbose but report only when a change is made
  -f, --silent, --quiet  suppress most error messages
  -v, --verbose          output a diagnostic for every file processed
      --no-preserve-root  do not treat '/' specially (the default)
      --preserve-root    fail to operate recursively on '/'
      --reference=RFILE  use RFILE's mode instead of MODE values
  -R, --recursive        change files and directories recursively
      --help     display this help and exit
      --version  output version information and exit

Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>


기본 사용법은 아래와 같이 변경하고자 하는 권한과 파일명을 명시하여 실행하면 됩니다.

chmod 755 test.txt


리눅스 파일 권한

리눅스 파일은 user, group, others 별로 read, write, execute 권한을 부여할 수 있습니다.


ls 명령으로 현재 파일에 부여되어 있는 권한을 확인할 수 있습니다.

[Linux] ls (파일 목록 보기)


[root@peterdev ch]# ls -l
total 0
-rw-r--r-- 1 root root 0 Jun  4 08:45 test.txt


-rw-r--r-- 에서 맨앞의 - 는 file 인지 directory인지 구분하는 symbol 입니다.

[root@peterdev test]# ls -l
total 44
-rwxr-xr-x 1 root root 8576 May 10 08:38 a.out
-rw-r--r-- 1 root root  214 May 10 08:38 arr1.c
-rw-r--r-- 1 root root  425 May 10 07:30 arr.c
drwxr-xr-x 2 root root 4096 Jun  4 08:45 ch
drwxr-xr-x 2 root root 4096 May  3 14:27 john
-rw-r--r-- 1 root root    0 May  8 14:40 mv_test.dat
-rw-r--r-- 1 root root    0 May  9 06:06 new_file
-rw-r--r-- 1 root root    5 May  9 06:09 new.txt
drwxr-xr-x 2 root root 4096 May  3 14:27 peter
-rw-r--r-- 1 root root   33 May 14 09:00 test1.txt
-rw-r--r-- 1 root root   33 May  8 14:56 test2.txt

이렇게 directory인 경우에는 d 라는 symbol로 표시됩니다.


rw-r--r-- 로 표시되는 부분이 부여된 권한을 나타내는데 3개씩 끊어서 보면

앞에 3개가 user 소유자(owner)의 권한이고,

중간에 3개는 group 대한 권한,

마지막 3개가 others 에 대한 권한이 됩니다.


이 권한을 8진수로 표현하면 rwx 권한을 다 갖는 경우 7이 됩니다.

각 권한을 숫자값으로 표현하면 r = 4, w = 2, x = 1 이기 때문에

r + w + x = 7

이렇게 되는 것이죠.


파일에 user와 group 에 대해서만 read 권한을 부여하려면 440 으로 적용하면 됩니다.


+, - 기호를 사용해서 특정 권한을 더하거나 뺄 수도 있습니다.


예제

ex) text.txt 파일에 대해서 user의 모든권한을 부여하고 group과 others는 모든 권한을 제외
chmod 700 test.txt

 

ex) text.txt 파일에 대해서 실행 권한 추가 부여
chmod +x test.txt

ex) text.txt 파일에 대해서 group에 write 권한 부여
chmod g+w test.txt
 

ex) text.txt 파일에 대해서 others의 모든 권한 박탈
chmod o-rwx test.txt
 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.




블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요