exec 명령의 가능한 사용법은 무엇입니까?


10

나는 exec명령을 배우고 있습니다. exec명령이 시작된 프로세스를 명령으로 대체 한다는 것을 알고 있습니다. 따라서 exec명령 으로 대체 된 프로세스로 돌아갈 수 없습니다 .

그것이 시작된 과정으로 돌아가는 것을 불가능하게하는 것이 목적이라고 말할 수있다.

그러나 exec명령으로 사용 가능한 것과 같은 다른 용도는 무엇 입니까?



1
위키피디아 기사 : "래퍼 스크립트는 종종 환경 변수 또는 기타 구성을 설정 한 후 직접 또는 인터프리터 또는 가상 머신을 통해 프로그램을 실행하기 위해이 명령을 사용합니다."
knb


2
개인적으로 저는 exec ssh server-that-does-byobu-on-login.example.com^ A ^ D가 터미널을 완전히 종료한다는 점에서 매우 기쁘게 생각합니다. (보다 일반적으로 exec byobu(또는 exec screen) exec tmux)
Williham Totland

답변:


9

랩퍼 스크립트에서

exec 래퍼 스크립트에서 주로 사용됩니다.

메인 프로그램을 실행하기 전에 프로그램 환경을 수정하려면, 종종 스크립트를 작성하고 그 끝에 메인 프로그램을 시작하십시오. 그러나 그 시점에서 스크립트가 메모리에 남아있을 필요는 없습니다. 따라서이 exec경우 메인 프로그램이 마더 스크립트를 대체 할 수 있도록 사용됩니다.

여기 실제적인 예가 있습니다. 그것은의 mate-terminal.wrapper스크립트는 동료 단자와 함께 제공됩니다. mate-terminal사용자 환경을 확인하여 추가 인수로 시작 합니다.

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

여기서 주목할 점 exec은 메모리에서이 스크립트를 대체 하는 호출 이 있다는 것입니다 .

다음은 Unix & Linux StackExchange Site- https: //unix.stackexchange.com/q/270929/19288에서 비슷한 질문입니다.

파일 설명자를 리디렉션하려면

또 다른 일반적인 용도는 exec파일 디스크립터를 리디렉션 하는 것입니다 . stdin, stdout, stderr간부를 사용하여 파일로 리디렉션 할 수 있습니다.

  1. 경로 재 지정 stdout- exec 1>file표준 출력 file이 현재 쉘 세션의 종료를 위해 명명 된 파일이됩니다 . 디스플레이로 출력 할 내용은 파일에 있습니다.

  2. 경로 재 지정 stdin- stdin파일 을 경로 재지 정하는 데 사용할 수도 있습니다 . 예를 들어, 스크립트 파일을 실행 script.sh하려면 stdin을 사용하여 파일을 파일로 리디렉션하면 됩니다 exec 0<script.sh.


괜찮아. 나중에 'mate-terminal'에는 래퍼 스크립트에 PID가 있습니까? 래퍼 스크립트가 사용한 메모리를 사용합니까? 래퍼 스크립트가 사라졌습니다. 그렇지 않으면 두 스크립트가 시스템에서 별도의 프로세스로 존재합니까 (두 개의 다른 PID)?
mizech

@mizech 예. 그들은 같은 PID를 사용합니다
Anwar

@mizech 도움이되었음을 알게되어 기쁘다 :)
Anwar

1
훌륭한 예, 정말 분명합니다
Zanna

이 답변은 부분적이며 중요한 (그리고 일반적인) 용도 중 하나를 그리워 exec합니다. 파일 설명 자의 리디렉션에 사용됩니다.
heemayl

9

exec 명령은 현재 쉘 프로세스를 지정된 명령으로 바꿉니다. 일반적으로 명령을 실행하면 새 프로세스가 생성됩니다 (포크 됨). 이 exec 명령은 새로운 프로세스를 생성하지 않습니다. 대신, 현재 프로세스는 새로운 명령으로 겹쳐집니다. 즉, exec새 프로세스를 작성하지 않고 현재 쉘 대신 명령이 실행됩니다.

exec 명령의 가장 일반적인 용도는 세 가지입니다.

1. 공정 교체

예 -1 : 다음bash 과 같이 새쉘을 여는 경우

$ bash 

pstree이처럼 보인다

gno─ 그놈 터미널
        ├─bash───bash───pstree

이전 bash쉘이 여전히 있으며 새 bash쉘 을 얻었습니다 . 새로운 bash 쉘을 열면

$ exec bash

pstree

gno─ 그놈 터미널
        ├─bash───pstree

여기서 오래된 bash것은 새로운 것으로 대체됩니다. 하나의 명령으로 여러 로그인을 종료하는 것이 특히 유용합니다. 더 안전하고 실수로 열린 터미널을 떠날 가능성을 없애줍니다. 하나의 명령으로 루트와 사용자 모두 종료를 참조하십시오.

예 -2 : 파일을 다음과 같이 열 수 있습니다

$ exec vi filename.txt

종료 vi하면 쉘이 이미 교체되었으므로 터미널을 별도로 닫을 필요가 없습니다. vi를 닫 자마자 터미널도 닫힙니다.

2. 쉘 스크립트 내에서 파일 디스크립터의 경로 재 지정 방법

exec 명령은 또한 가까운 쉘 스크립트에서 동적으로 열고 사용하고, 파일 기술자를 복사 할 수 있습니다. 이를 통해 명령 호출 문자열 대신 STDIN, STDERR, STDOUT 및 기타 파일 디스크립터를 쉘 스크립트 내의 다양한 파일로 경로 재 지정할 수 있습니다. 명령이나 인수를 지정하지 않으면 리디렉션 심볼과 파일 설명자를 지정하여 이러한 기능을 수행 할 수 있습니다.

script.sh로그 파일을 갖고 싶은 쉘 스크립트가 있다고 가정하면 다음 과 같이 script.log사용할 수 있습니다 exec.

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

어느 것이

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. exec 명령을 사용하여 프로세스 단계 작성

exec 명령을 사용하여 프로세스 단계와 같이 순차적으로 서로를 실행하는 쉘 스크립트 세트를 작성할 수도 있습니다. 컨트롤을 다음 스크립트로 전송해야 할 때마다 새 프로세스를 생성하는 대신 exec 명령을 실행합니다.

이 경우 각 단계의 마지막 문장은 exec다음 단계를 호출하는 명령 이어야합니다 .

자세한 내용 exec쉘 스크립트 에서 명령 사용을 참조하십시오 .

참고 : 위의 일부는 이것 에서 가져옵니다 .


1
완전한 대답 (지금까지).
heemayl

내가 exec를 사용한 모든 시간은 효율성을 위해서였습니다. exec로 데몬을 실행하면 2 개가 아닌 1 개의 활성 프로세스 만 있으면됩니다. bash 프로세스를 방치하면 몇 MB의 램이 낭비됩니다.
gmatht

2

내가 아는 한 bash 스크립트의 파일 설명자 (예 : STDOUT, STDERR, STDIN)를 리디렉션하는 데에도 사용됩니다.

예를 들어, STDIN 재 지정을 사용하여 키보드 대신 파일에서 읽고 STDOUT (또는 프로그램에 따라 STDERR 일 수 있음) 재 지정에 의해 터미널 대신 파일에 쓸 수 있습니다.


1
이 답변은 부분적으로 만이 답변을 보완 합니다 .
heemayl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.