내가 달릴 때
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
표준 출력은 이제 해당 파일로 이동해야 합니다.
이 방법은 더 복잡한 프로그램에는 적합하지 않을 수 있으며, 보안 제한, 디버거 정보 부족, 끔찍한 손상 등으로 인해 불가능할 수 있습니다.