[유닉스] 포그라운드(foreground), 백그라운드(background)


포그라운드(foreground), 백그라운드(background)

포그라운드와 백그라운드 작업의 이해

  • 쉘은 프로세스를 작업(job) 단위로 관리
  • 유닉스는 동시에 여러 작업을 할 수 있는 다중 작업(Multitasking) 운영체제
  • 포그라운드(foreground, 전위) 처리와 백그라운드(background, 후위) 처리 방식으로 동작

포그라운드 처리

  • 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 프롬프트가 출력되지 않아 다른 명령을 입력할 수 없어 기다려야 하는 경우
  • 사용자가 명령을 입력하면 쉘이 명령을 해석하여 실행한 결과를 화면에 출력
  • 사용자는 화면에 출력된 결과를 보고 다시 명령을 입력하여 대화식 작업을 함
  • 포그라운드 프로세스 : 포그라운드 처리로 실행되고 있는 프로세스, 포그라운드 작업
  • 포그라운드 처리의 예
    • find 명령이 끝날 때까지 기다려야 함
$ find / -name passwd

백그라운드 처리

  • 포그라운드 처리 방식은 한 번에 하나의 명령만 실행시키므로 여러 프로세스를 동시에 실행시킬 수 없음
  • 백그라운드 처리 방식은 여러 프로세스를 동시에 실행시킬 수 있음
  • 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속할 수 있음
  • 백그라운드 프로세스 : 백그라운드 방식으로 처리되는 프로세스, 백그라운드 작업
  • 명령을 백그라운드로 실행하려면 명령의 마지막에 &(앰퍼샌드) 기호를 추가
$ find / -name text &
[1] 6715
$
  • 백그라운드 프로세스는 실행 결과와 오류 메시지를 화면에 그대로 출력
  • 다른 작업할 때 방해받을 수 있으므로 출력 방향 전환하여 실행 결과를 파일로 저장
$ find / -name passwd > pw.dat &
[2] 6725
$
  • 오류 메시지를 출력 방향 전환하여 파일로 저장
$ find / -name passwd > pw.dat 2> pw.err &
[3] 6726
$
  • 다른 작업을 하는 도중 백그라운드 작업이 종료되면 Enter 키를 입력했을 때 백그라운드 작업 종료 메시지가 출력됨

포그라운드와 백그라운드 작업 제어

  • 작업 제어 : 작업 전환, 실행 중지, 작업 종료
  • 작업 전환 : 포그라운드 작업을 백그라운드 작업으로 전환, 백그라운드 작업을 포그라운드 작업으로 전환
  • 실행 중지 : 작업을 잠시 중단시키는 것
  • 작업 종료 : 프로세스 종료처럼 작업을 종료시키는 것

작업 목록 보기

  • jobs 명령
    • 백그라운드 작업을 모두 보여줌. 특정 작업 번호 지정하면 해당 작업의 정보만 보여줌
    • 형식 : jobs [%작업]
    • %작업
      • %번호 : 해당 번호의 작업 정보 출력
      • %+ 또는 %% : 작업 순서가 +인 작업 정보 출력
      • %- : 작업 순서가 –인 작업 정보 출력
    • 사용 예 : jobs %1, jobs
$ sleep 100&
[1] 6751
$ sleep 200&
[2] 6752
$ jobs
[1]- Running sleep 100 &
[2]+ Running sleep 200 &
$ jobs %1
[1]- Running sleep 100 &
$

작업 전환하기

  • fg 명령

    • 백그라운드 프로세스를 포그라운드 프로세스로 전환
    • 사용법 : fg [%작업번호]
    • 백그라운드로 수행 중인 작업이 여러 개인 경우 가장 최근에 수행한 작업(보통 + 기호가 붙어 있는 작업)을 포그라운드로 전환
$ jobs
[3]+ Running sleep 150 &
$ fg
sleep 150
  • bg 명령

    • 포그라운드 프로세스를 백그라운드 프로세스로 전환
$ sleep 150
^Z
[3]+ Stopped sleep 150
$ bg
[3]+ sleep 150 &
$ jobs
[2]- Running sleep 200 &
[3]+ Running sleep 150 &
$

작업 종료시키기

  • 포그라운드 작업은 Ctrl+C를 입력하면 종료됨
    • Ctrl+C는 인터럽트 시그널을 포그라운드 프로세스에 전달
    • 프로세스는 인터럽트를 받으면 기본적으로 종료
    • 종료시키고자 하는 프로세스의 PID를 다른 터미널에서 찾아 강제로 종료시키는 방법도 있음
  • 백그라운드 작업은 kill 명령으로 종료
  • kill 명령의 인자로 PID 대신 ‘%작업 번호’도 가능

로그아웃 후에도 백그라운드 작업 계속 실행하기

  • nohup 명령

    • 로그아웃 후에도 백그라운드 작업을 계속 실행시킴
    • 실행 중인 프로세스의 표준 출력과 표준 에러는 ‘nohup.out’이라는 파일을 생성하여 기록,
    • nohup 명령행 뒤에 ‘&’를 명시해야 함
    • 형식 : nohup 명령&
$ nohup find / -name passwd &
[1] 7050
$ nohup: ignoring input and appending output to ‘nohup.out’
$


사용자 전환하기

로그인한 모든 사용자 정보 보기

  • users 명령

    • 현재 시스템에 로그인하고 있는 사용자명 출력
    • 명령의 결과를 한 행으로 출력
    • 형식 : users
$ users
ksshin ksshin
$
  • who 명령

    • 시스템을 사용하고 있는 사용자의 자세한 정보 출력
    • 사용자명, 사용자가 접속한 단말기 번호, 사용자가 로그인한 시간, 외부 컴퓨터 이름이나 IP 주소 등
    • 형식 : who [옵션]
    • 옵션
      • -q : 사용자명만 출력
      • -H : 출력 항목의 제목도 함께 출력
      • -b : 마지막으로 재부팅한 날짜와 시간 출력
$ who
ksshin tty1 2015-06-10 14:42
ksshin :0 2015-06-10 14:38 (:0)
$
  • w 명령
    • 로그인한 사용자 정보와 현재 작업의 정보 출력
    • 사용자 정보 외에 시스템 정보도 출력
    • 시스템 정보 : 현재 시간, 시스템이 부팅된 후 현재까지 경과된 기간, 로그인하고 있는 사용자 수, 실행 대기 중인 작업의 수
    • 사용자 정보 : 사용자명, 단말기 번호, 로그인한 시간, 휴지(idle) 시간, JCPU, PCPU, 실행하고 있는 명령

      • 휴지 시간 : 마지막 명령 실행 후부터 현재까지 작업하지 않고 있는 시간
      • JCPU : 로그인한 후 실행했던 전체 프로세스에서 사용한 CPU 시간
      • PCPU : 현재 실행 중인 프로세스가 사용한 CPU 시간
      • what : 현재 실행 중인 명령
    • 형식 : w [사용자명]
$ w
17:05:24 up 1 day, 15:41, 2 users, load average: 0.22, 0.16, 0.15
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ksshin tty1 10 6월 15 4.00s 11.93s 0.09s w
ksshin :0 :0 10 6월 15 ?xdm? 4:40m 5.36s init --user
$

자신의 정보 보기

  • who am i 명령

    • 로그인 정보 출력
    • who 명령에 인자로 am i를 지정한 것
    • who 명령의 결과 중 자신에 대한 정보만 출력
    • whoami보다 상세한 사용자 정보 확인할 때 사용
$ who am i
ksshin tty1 2015-06-10 14:42
$
  • whoami 명령

    • 자신의 로그인 사용자명 출력
    • 가상콘솔을 사용하거나 여러 계정으로 동시에 로그인하고 있는 경우 현재 시스템을 사용하고 있는 사용자를확인할 때
    • 형식 : whoami
$ whoami
ksshin
$
  • id 명령

    • 현재 사용자의 로그인 ID와 그룹 정보 출력
    • 사용자명, uid(사용자를 구분하는 번호), gid(그룹을 구분하는 번호) 정보 출력
    • 형식 : id [옵션]
    • 옵션 : -a : 모든 그룹 정보 출력
$ id
uid=1001(user1) gid=1001(user1) groups=1001(user1)
$

사용자 전환하기

  • su 명령

    • 다른 사용자로 전환
    • 전환하려는 사용자의 비밀번호를 알고 있어야 함
    • 형식 : su [-] [사용자명]
    • 사용 예 : su, su – user1
    • 다시 돌아가려면 exit 명령 사용
$ su user1
Password:
$ whoami
user1
$ pwd
/home/ksshin
$ exit
$ whoami
ksshin
$
  • 사용자가 ksshin에서 user1으로 전환하였지만 현재 디렉토리는 /home/ksshin
  • su 명령만 사용하면, 사용자는 전환되지만 디렉토리는 변하지 않음
  • ‘-’ 옵션을 사용하면 사용자의 초기화 파일을 실행시켜 작업 디렉토리도 변경
$ su - user1
Password:
$ pwd
/home/user1
$
  • su 명령을 사용자 이름 지정 없이 사용하여 root로 전환
$ su
Password:
# whoami
root
#