bg 명령을 사용한 후 출력을 nohup처럼 리디렉션할 수 있나요?

bg 명령을 사용한 후 출력을 nohup처럼 리디렉션할 수 있나요?

내가 달릴 때

apt-get -y upgrade

나는 일반적으로 다음과 같은 출력을 봅니다.

"the following packages will be upgraded..."

ctrl+ z및를 사용하여 bg프로세스를 백그라운드에 배치하지만 다른 명령을 실행해도 해당 출력이 stdout에 나타납니다.

nohup백그라운드 프로세스/명령의 출력을 이와 같은 파일로 리디렉션할 수 있습니까 ?

답변1

이 접근 방식은 바람직하지 않습니다. 사용하지 마세요. 시스템이 중단되더라도 모든 부분을 그대로 유지할 수 있습니다.

좋아요! 아직도 나와 함께 있나요? 적절한 include ( , for ) 가 있는 fcntl간단한 경우 에는 open(이론적으로) 표준을 다른 곳으로 리디렉션하는 것이 가능합니다.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("blat\n");
        sleep(1);
    }
    exit(EXIT_SUCCESS);
}

컴파일하고 실행합니다:

$ cc -g    blat.c   -o blat
$ ./blat &

이제 다른 터미널에서(다양한 이유로 보안 정책 위반을 실행할 수 있는 라이브 프로세스에 대해 디버거가 수행할 수 있는 작업을 고려하여) 백그라운드 작업에 대해 게시된 PID를 사용합니다.

$ gdb -q -p 3727
...
(gdb) call close(1)
$1 = 0

읽고 나서close(2)성공했다고 확신합니다. 표준 입력이 종료되었습니다. 새 파일을 열어보자...

(gdb) call open("/home/userrunningblat/blat.out", O_CREAT|O_WRONLY, 0666)
No symbol "O_CREAT" in current context.

좋은 샷입니다. 이 기호가 누락된 매직 넘버는 무엇입니까? 세 번째 터미널에서는 핸디를 이용하세요일부 C 프로그램 컴파일 및 실행:

$ cfu 'printf("%d\n", O_CREAT|O_WRONLY)'
65

아니면 디렉토리를 직접 파헤쳐 /usr/include입력 형식을 알아내고 비트별 OR을 수행할 수도 있지만 이는 매우 짜증나는 일입니다. (또한 이 숫자는 운영 체제에 따라 다를 수 있으며 실제로 다를 수 있습니다.) 뒤로 gdb!

(gdb) call open("/home/userrunningblat/blat.out", 65, 0666)
$2 = 1
(gdb) quit
$ tail -f blat.out

1이는 이전에 stdout( ) 을 닫았기 때문에 이open(2)파일 설명자 번호는 호출에서 재사용되었으므로 종료 후 gdb표준 출력은 이제 해당 파일로 이동해야 합니다.

이 방법은 더 복잡한 프로그램에는 적합하지 않을 수 있으며, 보안 제한, 디버거 정보 부족, 끔찍한 손상 등으로 인해 불가능할 수 있습니다.

관련 정보