서비스(데몬) 자동 시작 설정 방법은 3가지가 있다.

  1. rc.local에 얹기
    • 데몬 하나 정도는 괜찮지만 2개부터는 관리가 안됨
  2. systemctl에 새로 등록 (systemd)
    • 해당 데몬을 위한 서비스를 새로 만들어서 관리
    • CentOS7이상, Ubuntu에서 사용
  3. chkconfig에 등록
    • CentOS6이하에서도 가능

 

나는 OS를 Rocky 8을 사용중이므로 systemctl에 서비스를 새로 등록하는 방법으로 진행하겠다.

  • 목적 : 서버 재부팅 시 Root가 아닌 일반 사용자(jmpark)으로 서비스 데몬 자동 시작
  • 테스트 OS : Rocky8.10
  • 서비스 관리 명령어 : systemctl
  • runServer.sh : 실행 파일을 위에서 설정한 환경 변수들을 인자로 전달하여 백그라운드에서 실행하는 스크립트

 

runServer.sh는 내가 사용하는 스크립트이므로
데몬 자동시작 테스트할 스크립트 rebootTest.sh를 만들어서 이해하면 좋을듯!
rebootTest.sh는 하단에 참고한 블로그에 나와있는 내용임을 밝힙니다.

 

# 데몬 자동시작 테스트할 스크립트  rebootTest.sh 작성

더보기

 테스트 스크립트 작성

  • 실제 스크립트를 만들기 전에 작동하는지 테스트하기 위한 스크립트를 작성
  • /app/server/bin 위치에 rebootTest.sh 를 만듦 (위치는 알아서 상황에 맞게)
  • 실행시 현재시간을 기록하는 스크립트 작성
[jmpark@localhost bin]$ cat rebootTest.sh
#!/bin/sh
date >> /logs/server/date_log.txt

 

  • 스크립트 실행 권한 부여 (rw-r--r-- --> rwxr-xr--)
[jmpark@localhost bin]$ chmod 754 rebootTest.sh #chmod +x rebootTest.sh 로 권한 부여 가능
[jmpark@localhost bin]$ ll
합계 48
-rwxr-xr--. 1 jmpark jmpark   47  8월  2 12:55 rebootTest.sh
-rwxr-x---. 1 jmpark root    186  4월 15 22:14 restartServer.cmd
-rwxr-x---. 1 jmpark root    205  4월 15 22:14 restartServer.sh
-rwxr-x---. 1 jmpark root   9948  7월 27 00:06 rtim-server
-rwxr-x---. 1 jmpark root   7065  7월 27 00:06 rtim-server.bat
-rwxr-x---. 1 jmpark root   1090  4월 15 22:14 runServer.cmd
-rwxr-x---. 1 jmpark root   1155  4월 15 22:14 runServer.sh
-rwxr-x---. 1 jmpark root    183  4월 15 22:14 stopServer.cmd
-rwxr-x---. 1 jmpark root    202  4월 15 22:14 stopServer.sh

 

  • 스크립트 실행
[jmpark@localhost bin]$ sh rebootTest.sh
[jmpark@localhost bin]$ cat /logs/server/date_log.txt
2024. 08. 02. (금) 13:21:55 KST

 

잘 실행된 걸 확인 할 수 있음!

 

# systemd에 등록하여 systemctl에서 관리가 가능하도록 설정

  • systemd 경로 : /etc/systemd
  • 서비스 이름 : server (서비스 이름은 알아서 정하면 됨)
  • /etc/systemd/system 경로에 server.service를 만들고 설정 (만들 때 당연히 root 사용자로 파일 만들어야 함)
  • systemd는 유닛 파일이 실행 가능한 파일이 되어서는 안됨
  • 권한은 644를 기본으로 하며, 이와 다를 경우 보안상 취약한 상태
[root@localhost ~]# cd /etc/systemd/system/
[root@localhost system]# vi server.service
[Unit]
Description=Run RTIM Server as jmpark user

[Service]
Type=forking
User=jmpark
WorkingDirectory=/app/server/bin
ExecStart=/bin/bash /app/server/bin/runServer.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target # 시스템 부팅 시 대부분의 서비스가 실행되는 기본 대상을 의미

 

## Service Type 설정

개인적인 생각이지만 service 타입 설정이 제일 중요한 듯, 구동시키는 스크립트가 어떤 기능을 하는지에 따라 설정해줘야 한다. 아니면 백날천날 안됨.

더보기
  1. simple:
    • 기본값으로, ExecStart에 설정된 프로그램이 즉시 실행되고, 그 프로그램이 실행 중인 상태로 간주됩니다.
    • 이 타입은 프로그램이 포그라운드에서 실행될 때 사용합니다. 만약 runServer.sh가 포그라운드에서 실행되고, 해당 프로세스가 종료되지 않는다면 이 타입을 사용할 수 있습니다.
  2. forking:
    • ExecStart에서 실행된 프로세스가 자식 프로세스를 생성하고, 부모 프로세스가 종료되는 경우에 사용합니다.
    • 만약 runServer.sh가 서버를 데몬 형태로 실행하고, 부모 프로세스가 종료되며 자식 프로세스가 계속 실행된다면 이 타입을 선택해야 합니다.
  3. oneshot:
    • 주로 초기화 작업이나 설정을 위해 사용되며, 스크립트가 실행된 후 종료되더라도 서비스가 활성 상태로 간주되도록 합니다.
    • 만약 runServer.sh가 서버를 실행한 후에 종료된다면 이 타입을 사용할 수 있지만, 일반적으로 서버 프로그램은 지속적으로 실행되므로 적합하지 않을 수 있습니다.

 

나의 경우는 runServer.sh rtim-server를 백그라운드에서 실행하는 방식으로 설정되어 있기 때문에,
'forking'으로 설정하는 것이 적합했다. forking은 부모 프로세스가 종료되고 자식 프로세스가 지속적으로 실행되기 때문..

 

단순한 로그를 남기는 rebootTest.sh는 'simple'을 사용하면 된다.

 

## User 설정

OS는 기본적으로 reboot시 root로 실행시키기 때문에 여기서 데몬을 구동시킬 사용자를 명시해주면 됨

- 물론 여기서 설정한 사용자는 WorkingDirectory나 ExecStart에서 설정한 경로와 스크립트에 접근 실행 권한을 모두 가지고 있어야 함, 필요에 따라 소유자도 변경

 

 

## ExecStart 설정

구동시킬 스크립트 적는 명령어 

- Environment를 통해 환경변수를 설정하고 경로에 환경변수를 이용할 수 도 있고

/bin/bash -c "/app/server/bin/rebootTest.sh start"

이런 식으로 다양하게 적을 수 있음

 

## Restart 설정

Restart=on-failure는 서버가 의도치 않게 비정상적으로 종료되었을 때 자동으로 재시작하는 설정이고

비정상 종료된 기준이 궁금하면 접은 글 펴보세욥

더보기
  1. 프로세스가 비정상적으로 종료된 경우:
    • 프로세스가 exit 코드 0이 아닌 값으로 종료되거나, SIGKILL (kill -9)와 같은 신호로 강제 종료된 경우를 말합니다. 즉, 프로세스가 예기치 않게 종료된 경우입니다.
    • 예를 들어, kill -9 pid와 같은 명령어로 프로세스를 종료하면, systemd는 이를 비정상 종료로 간주합니다.
  2. 정상 종료와 비정상 종료:
    • 정상적으로 종료된 경우는 exit 0 코드를 반환하는 경우입니다. 예를 들어, systemctl stop server.service를 통해 서비스가 정상적으로 중지되면 systemd는 이를 정상 종료로 간주합니다.
    • reboot 명령어로 시스템이 재부팅될 경우에도 서비스는 비정상 종료로 간주되지 않습니다. systemd는 서비스가 시스템 종료 또는 재부팅 중에 중지되었음을 인식하고, 이를 정상적인 종료로 처리합니다.
  3. ExecStop과 관련된 스크립트:
    • stopServer.sh와 같은 스크립트를 통해 서버를 정지하는 경우, 해당 스크립트가 정상적으로 실행되고 종료되면 systemd는 이를 정상 종료로 간주합니다. 이 경우, 스크립트가 종료 코드 0을 반환해야 합니다.

# workingDirecory

더보기
  1. 작업 디렉토리 설정:
    • WorkingDirectory는 실행할 명령어가 사용해야 할 기본 작업 디렉토리를 지정합니다. 이는 명령어가 상대 경로로 파일을 찾거나 생성할 때 기준이 되는 디렉토리입니다.
    • 예를 들어, ExecStart에 명시된 경로가 절대 경로일지라도, 실행 중에 발생하는 파일 작업은 WorkingDirectory에서 상대적으로 처리됩니다.
  2. 파일 접근 문제 방지:
    • 명령어가 실행될 때, 해당 명령어가 사용하는 파일이나 리소스가 WorkingDirectory에 있을 경우, 상대 경로로 접근할 수 있습니다. 만약 WorkingDirectory가 설정되어 있지 않다면, 기본적으로 /(루트 디렉토리)에서 실행되므로 파일을 찾지 못할 수 있습니다.
  3. 스크립트나 프로그램의 통일성:
    • 여러 스크립트나 프로그램이 동일한 작업 디렉토리를 사용해야 할 경우, WorkingDirectory를 통해 일관된 작업 환경을 제공할 수 있습니다. 이는 특히 복잡한 애플리케이션에서 유용합니다.
  • WorkingDirectory=/app/server: 이 설정으로 인해, rtim-server가 실행될 때 기본 작업 디렉토리는 /app/server가 됩니다.
  • ExecStart=/app/server/bin/rtim-server start: 이 경로는 명령어의 절대 경로입니다.

이 경우, 만약 rtim-server가 상대 경로로 파일에 접근해야 한다면, /app/server를 기준으로 하게 됩니다. 따라서, 파일 작업이 더 원활하게 이루어질 수 있습니다.

# 서비스 등록 여부 확인 및 자동시작 설정

  • 등록한 서비스 보이는지 확인
[root@localhost system]# systemctl status server
● server.service - when reboot, server.service auto start to user
   Loaded: loaded (/etc/systemd/system/server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
   
[jmpark@localhost ~]$ systemctl enable server

 

# systemctl 명령어로 시스템 돌려보기

[jmpark@localhost ~] su -
암호:
[root@localhost ~]# systemctl start server
[root@localhost ~]# ps -ef | grep Main
jmpark       928       1  0 15:06 ?        00:00:08 java -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -verbose:gc -Xloggc:../logs/gc.log -XX:+PrintGCTimeStamps -XX:-TraceClassUnloading -XX:+PrintHeapAtGC -Djava.net.preferIPv4Stack=true -DPROV -classpath /app/server/conf

구동 확인 됨. rebbot 해서 동일한 명령어로 다시 확인하면 끝!

 

나같은 경우는 Server 구동됬는지 ps -ef로 확인 했지만

rebootTest.sh로 설정한 사람들은 /logs/server/date_log.txt에 로그가 잘 쌓였는지 확인하면 됨


참고한 블로그 ( 그대로 따라해도 안되는 망고매직.. )

https://dong-it-engineer.tistory.com/35

 

리눅스 재부팅시 서비스 자동시작

리눅스 서비스(데몬) 자동시작 3가지방법 1) rc.local에 얹기 -- 데몬 하나정도는 괜찮은데 2개부터는 관리가 안됨 2) systemctl에 새로 등록 (systemd) -- 해당 데몬을 위한 서비스를 새로 만들어서 관리 --

dong-it-engineer.tistory.com

'OS' 카테고리의 다른 글

[Mac] 사용자 추가 및 홈 디렉토리 설정  (0) 2024.08.04

1. 루트 사용자로 전환

jungmin@bagjeongmin-ui-MacBookPro ~ % sudo -s
Password:

 

2. 사용자 추가

root@bagjeongmin-ui-MacBookPro ~ # sudo dscl . -create /Users/rathon

 

3. 추가한 사용한 UID(사용자ID) 할당

 - 1001번 사용 중인지 조회해보고 없으니까 할당 후 확인!

root@bagjeongmin-ui-MacBookPro ~ # dscl . list /Users UniqueID | grep 1001

root@bagjeongmin-ui-MacBookPro ~ # sudo dscl . -create /Users/rathon UniqueID 1001

root@bagjeongmin-ui-MacBookPro ~ # dscl . list /Users UniqueID | grep 1001

rathon                   1001

 

4. 추가한 사용한 GID(그룹 ID) 할당

 - 간단한 작업을 위해 추가한 사용자라 admin 그룹까지는 아니고 staff 권한을 주겠다. 

root@bagjeongmin-ui-MacBookPro /Users # ls -al
total 0
drwxr-xr-x   5 root     admin   160  2 17 23:31 .
drwxr-xr-x  20 root     wheel   640  2  3  2024 ..
-rw-r--r--   1 root     wheel     0  2  3  2024 .localized
drwxrwxrwt   7 root     wheel   224  5  8 00:32 Shared
drwxr-x---+ 39 jungmin  staff  1248  8  4 18:59 jungmin

 

- staff 그룹 아이디 조회

root@bagjeongmin-ui-MacBookPro /Users # dscl . -read /Groups/staff

AppleMetaNodeLocation: /Local/Default
GeneratedUID: ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000014
GroupMembers: FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000 B5033C0C-C195-4FAC-B7ED-607CF32C2DCD
GroupMembership: root jungmin
Password: *
PrimaryGroupID: 20
RealName: Staff
RecordName: staff BUILTIN\Users
RecordType: dsRecTypeStandard:Groups
SMBSID: S-1-5-32-545

 

 - 그룹 아이디 할당

root@bagjeongmin-ui-MacBookPro /Users # sudo dscl . -create /Users/rathon PrimaryGroupID 20

 

5. 사용자 홈 디렉토리 생성 / 소유자 변경

root@bagjeongmin-ui-MacBookPro /Users # ls -al
total 0
drwxr-xr-x   5 root     admin   160  2 17 23:31 .
drwxr-xr-x  20 root     wheel   640  2  3  2024 ..
-rw-r--r--   1 root     wheel     0  2  3  2024 .localized
drwxrwxrwt   7 root     wheel   224  5  8 00:32 Shared
drwxr-x---+ 39 jungmin  staff  1248  8  4 18:59 jungmin
root@bagjeongmin-ui-MacBookPro /Users #
root@bagjeongmin-ui-MacBookPro /Users #
root@bagjeongmin-ui-MacBookPro /Users #
root@bagjeongmin-ui-MacBookPro /Users #
root@bagjeongmin-ui-MacBookPro /Users #
root@bagjeongmin-ui-MacBookPro /Users # sudo mkdir /Users/rathon
root@bagjeongmin-ui-MacBookPro /Users # sudo chown rathon:staff /Users/rathon
root@bagjeongmin-ui-MacBookPro /Users # ls -al
total 0
drwxr-xr-x   6 root     admin   192  8  4 19:33 .
drwxr-xr-x  20 root     wheel   640  2  3  2024 ..
-rw-r--r--   1 root     wheel     0  2  3  2024 .localized
drwxrwxrwt   7 root     wheel   224  5  8 00:32 Shared
drwxr-x---+ 39 jungmin  staff  1248  8  4 18:59 jungmin
drwxr-xr-x@  2 rathon   staff    64  8  4 19:33 rathon


5. 사용자 홈 디렉토리 지정

root@bagjeongmin-ui-MacBookPro /Users # sudo dscl . -create /Users/rathon NFSHomeDirectory /Users/rathon

 

6. 사용자의 로그인 쉘 지정

root@bagjeongmin-ui-MacBookPro /Users # sudo dscl . -create /Users/rathon UserShell /bin/zsh

 

7. 비밀번호 설정

root@bagjeongmin-ui-MacBookPro /Users # sudo passwd rathon
Changing password for rathon.
New password:
Retype new password:

################################### WARNING ###################################
# This tool does not update the login keychain password.                      #
# To update it, run `security set-keychain-password` as the user in question, #
# or as root providing a path to such user's login keychain.                  #
###############################################################################

 

끝!

 

사용자 변경해서 작업하자

root@bagjeongmin-ui-MacBookPro /Users # su - rathon
rathon@bagjeongmin-ui-MacBookPro ~ %

좀비 프로세스와 고아 프로세스는 서로 다른 개념입니다.

좀비 프로세스는 자식 프로세스가 종료되었으나 부모 프로세스가 wait() 함수를 호출하지 않아서 자원을 해제하지 못한 상태의 프로세스를 말합니다. 이런 프로세스는 프로세스 테이블에는 남아있지만 더 이상 실행되지 않으며, 시스템의 자원을 낭비하게 됩니다.

고아 프로세스는 자식 프로세스가 종료되었으나 부모 프로세스가 이를 처리하지 못한 상태의 프로세스를 말합니다. 이런 프로세스는 부모 프로세스가 없어져서 init 프로세스가 새로운 부모가 되고, init 프로세스가 자동으로 wait() 함수를 호출하여 자식 프로세스의 자원을 해제합니다.

따라서, 좀비 프로세스와 고아 프로세스는 모두 자원 낭비를 초래할 수 있습니다. 하지만, 해결 방법이 다릅니다. 좀비 프로세스는 부모 프로세스가 wait() 함수를 호출하면서 해제할 수 있고, 고아 프로세스는 init 프로세스가 자동으로 처리해줍니다.

 

드래그하면 답변이 보입니다!

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

[리눅스] process 관련 system call 설명  (0) 2023.04.04
[리눅스] vi파일 명령어_우분투  (0) 2023.03.31

system call에 대한 간단한 설명

  • fork() system call은 새로운 프로세스를 생성 할 때 사용된다.
  • wait() system call은 자식 프로세스가 끝날때 까지 기다릴 때 사용된다.
  • getpid() system call은 현재 프로세스의 id 를 가져온다.
  • getppid() system call은 부모 프로세스의 id(parent pid) 를 가져온다.

 

이해를 돕기 위한 코드

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    pid_t returned_pid;
    printf("Hello, my pid is %d\n", getpid());

    if((returned_pid=fork()) < 0){
        perror("fork error"); exit(1);
    }
    else if(returned_pid == 0){
        printf("child: pid = %d, ppid = %d\n", getpid(), getppid());
    }
    else{
        wait(NULL); // 자식 프로세스가 모두 끝날 때까지 기다린다.
        printf("parent: I created child with returned_pid=%d\n", returned_pid);
    }

    printf("Bye, my pid is %d\n", getpid());

    return 0;
}

 

위 소스 코드에 대한 설명

먼저, main문이 실행이 되면 Hello, my pid is 부모pid가 출력된다.

  • fork() 함수를 호출하는 순간, 자식 프로세스, 부모 프로세스의 분기가 시작되서 하위의 내용을 각각 실행한다.
  • fork함수의 반환 값은 자식 프로세스일 경우 0을 반환하고, 부모 프로세스일 경우 0 이상의 값을 반환한다.
  • 분기가 시작되었을 경우 자식 프로세스가 먼저 실행될 지, 부모 프로세스가 먼저 실행될 지는 알 수 없다.
  • 하지만 wait() system call을 사용했을 경우, 자식 프로세스가 종료될 때까지 부모 프로세스는 기다린다.
  • 때문에 child: pid = 자식 프로세스의 pid, ppid = 부모 프로세스의 pid를 출력하고, parent: I created child with pid = 자식 프로세스의 pid이 출력되게 된다.

 

아래는 이해를 돕기 위한 그림입니다. (부모 프로세스 pid: 135, 자식 프로세스 pid: 136이라 할 때)

 

위 소스코드의 수행결과

- 부모 프로세스 pid: 135, 자식 프로세스 pid: 136이라 할 때의 수행 결과

Hello, my pid is 135
child: pid = 136, ppid = 135
Bye, my pid is 136
parent: I created child with pid=136
Bye, my pid is 135

 

출처: https://wkdtjsgur100.github.io/process-system-call/

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

[Linux] what is diffrent zombie and orphan process?  (0) 2023.04.06
[리눅스] vi파일 명령어_우분투  (0) 2023.03.31

vi 파일 저장 및 종료하기

모드 명령키 설명
마지막 행 모드 :q vi에서 작업한것이 없을때 vi 종료합니다.
:q! 작업한 내용을 저장하지 않고 종료합니다.
:w[파일명] 작업한 내용을 저장만 한다. 파일명을 지정하면 새 파일로 저장합니다.
:wq. :wq! 작업한 내용을 저장하고 vi를 종료합니다.
명령 모드 ZZ (대문자) 작업한 내용을 저장하고 vi를 종료합니다.

내용을 편집한 후 vi를 종료하려면 명령모드나 마지막 행 모드에서 명령을 입력해야 합니다. 마지막 행 모드로 가려면 : 을 누르면 됩니다. 명령모드에서 파일의 저장과 종료를 동시에 수행하려면 대문자ZZ를 누르시면 파일을 저장한 후 vi를 바로 종료합니다.

 

vi 입력모드로 전환하기

명령키 설명
i 현재 커서 앞에 입력합니다.
a 현재 커서 뒤에 입력합니다.
o 커서가 위치한 행의 다음 행에 입력합니다.
I(대문자 i) 커서가 위치한 행의 첫 컬럼으로 이동하여 입력합니다.
A 커서가 위치한 행의 마지막 컬럼으로 이동하여 입력합니다.
O 커서가 위치한 행의 이전 행에 입력합니다.

vi 편집기에서 내용을 입력하려면 입력모드로 전환해야 합니다.

 

ESC 누를 시 다시 명령모드로 전환.

 

vi 커서 이동하기

명령키 설명
k 커서를 위로 이동합니다.
j 커서를 아래로 이동합니다.
h 커서를 왼쪽으로 이동합니다.
l 커서를 오른쪽으로 이동합니다.
^ / O 커서를 현재 행의 처음으로 이동합니다.
$ 커서를 현재 행의 마지막으로 이동합니다.
- 커서를 한줄 위 처음으로 이동합니다.
+ / Enter 커서를 다음 행의 처음으로 이동합니다.
H 커서를 화면의 맨 윗행으로 이동합니다.
M 커서를 화면의 중간 행으로 이동합니다.
L 커서를 화면의 맨 아랫행으로 이동합니다.
w 커서를 다음 단어의 첫 글자로 이동합니다.
b 커서를 앞 단어의 첫 글자로 이동합니다.
e 커서를 다음 단어의 마지막 글자로 이동합니다.
G 파일의 마지막 행으로 커서를 이동합니다.
행번호G 지정한 행 번호로 커서를 이동합니다.
:행번호 지정한 행 번호로 커서를 이동합니다. (마지막 행 모드)
:$ 파일의 마지막 행으로 커서를 이동합니다. (마지막 행 모드)

vi에서는 마우스로 커서를 이동할 수 없고 오로지 키보드로만 커서를 이동할 수 있습니다.

 

vi 화면 이동하기

명령 키 설명
Ctrl + u 화면의 절반 만큼 위로 이동합니다.
Ctrl +ㅇ 화면의 절반 만큼 아래로 이동합니다.
Ctrl + b / Page Up 한화면 위로 이동합니다.
Ctrl + f / Page Down 한화면 아래로 이동합니다.
Ctrl + y  화면을 한 행 위로 이동합니다.
Ctrl + e 화면을 한 행 아래로 이동합니다.

파일의 크기가 터미널 화면의 크기보다 클 경우에는 화면을 이동하여야합니다.

 

vi 내용 수정하기

명령 키 설명
r 커서가 위치한 글자를 다른 글자로 수정합니다.
cw, [수정할 단어 수]cw 커서위치에서부터 현재 단어의 끝까지 수정합니다. 숫자cw는 커서 위치로부터 지정한 숫자의 단어 만큼 수정합니다.
s, [수정할 글자 수]s 커서 위치로부터 ESC키를 입력할때까지 수정합니다. 숫자s는 커서 위치로부터 지정한 숫자만의 글자를 수정합니다.
cc 커서가 위치한 행의 내용을 모두 수정합니다.
C 커서 위치로부터 행의 끝까지 수정합니다.

vi에서는 내용을 수정할 수 있는 다양한 명령어를 제공합니다.

 

vi 내용 삭제하기

명령 키 설명
x, [삭제할 글자 수]x 커서가 위치한 글자를 삭제합니다. x앞에 삭제할 글자수를 지정할수도 있습니다.
dw, [삭제할 단어 수]dw 커서가 위치한 단어를 삭제합니다. dw앞에 삭제할 단어수를 지정할수도 있습니다.
dd, [삭제할 행 수]dd 커서가 위치한 행을 삭제합니다. dd앞에 삭제할 행의수를 지정할수도 있습니다.
D 커서 위치로부터 행의 끝까지 삭제합니다.

vi에서는 내용을 삭제할 수 있는 다양한 명령어를 제공합니다.

 

vi 명령 취소하기

명령 키 설명
u 명령을 취소합니다.
U 해당 행에서 한 모든 명령을 취소합니다.
:e! 마지막으로 저장한 내용 이후의 것을 모두 취소합니다.

vi에서 명령을 잘못 입력한 경우 그 명령을 취소할수도 있습니다. 윈도우에서의 Ctrl +Z와 비슷한 기능이라고 생각하시면 됩니다.

 

vi 범위 지정하기

명령 키 설명
1, $, % 1행부터 마지막 행까지 범위를 지정합니다.
1,. 1행부터 커서가 있는 행까지 지정합니다.
.,$ 커서가 있는 행부터 마지막 행까지 지정합니다.
.,.+2 현재 행과 두번째 아랫행까지 지정합니다.
10,20 10행부터 20행까지 지정합니다.

윈도우에서는 마우스를 드래그하면 범위를 지정할 수 있지만 vi에서는 위의 명령키를 입력하여 범위를 지정하여야 합니다.

 

vi 내용 복사하기 / 잘라내기 / 붙이기

명령 키 설명
yy, [복사할 행 수]yy 커서가 위치한 행을 복사합니다. yy앞에 복사할 행의 수를 지정할 수도 있습니다.
dd, [잘라내기할 행 수]dd 커서가 위치한 행을 잘라내기합니다. 삭제와 같은 명령어입니다. dd앞에 잘라내기할 행 숫자를 입력할 수도 있습니다.
p 커서가 위치한 행의 아래쪽에 붙여넣기를 합니다.
P 커서가 위치한 행의 위쪽에 붙여넣기를 합니다.

vi에서도 일반적인 편집기처럼 내용을 복사하거나 잘라붙이기도 가능합니다.

 

vi 내용 검색하기

명령 키 설명
/문자열 문자열을 커서 아래 방향으로 검색합니다.
?문자열 문자열을 커서 위 방향으로 검색합니다.
n 원래 방향으로 다음 문자열을 검색합니다.
N 반대 방향으로 다음 문자열을 검색합니다.

윈도우에서 Ctrl+F를 하여 문자열을 검색하듯 vi에서도 문자열을 검색할 수 있습니다.

 

vi 내용 치환하기

명령 키 설명
:s/[대상문자열]/[바꿀문자열] 커서가 위치한 행에서 첫번째로 나오는 대상문자열을 바꿀문자열로 바꿉니다.
:%s[대상문자열]/[바꿀문자열] 파일 전체에서 모든 대상문자열을 바꿀문자열로 바꿉니다.
:[범위]s[대상문자열]/[바꿀문자열] 범위 내 모든 각 행에서 첫번쨰로 나오는 대상문자열을 바꿀문자열로 바꿉니다.
:[범위]s[대상문자열]/[바꿀문자열]g 범위 내 모든 행에서 대상문자열을 바꿀문자열로 바꿉니다.
:[범위]s[대상문자열]/[바꿀문자열]gc 범위 내 모든 행에서 대상문자열을 바꿀문자열로 바꾸되 수정할 지 여부를 묻습니다.

문자열을 바꿀 수도 있습니다. 다만 문자열을 바꿀때에는 마지막 행모드로 전환을 해야만 사용이 가능합니다. 명령어 앞의  : 는 마지막 행모드로 전환하는 명령키입니다.

 


출처:

coding-factory.tistory.com/505

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

[Linux] what is diffrent zombie and orphan process?  (0) 2023.04.06
[리눅스] process 관련 system call 설명  (0) 2023.04.04

+ Recent posts