command 를 사용하여 작업을 백그라운드에 넣을 때 job 명령의 출력이 있습니다 bg
.
bg
명령 과 같이 백그라운드에 작업을 배치하지만 출력이 없는 방법은 무엇입니까 ?
>/dev/null 2>1
추신: 작업은 출력이 있는 명령에 연결됩니다(원래 명령에는 없음)
답변1
tty 장치에 쓰기를 중지하려면 현재 백그라운드에 있는 애플리케이션에 알려야 합니다. 이를 수행하는 보편적인 방법은 없습니다.
넌 할 수있어:
stty tostop
SIGTTOU
tty에 쓰려고 할 때 백그라운드 작업이 (신호와 함께) 일시 중단됩니다 .
디버거를 프로세스에 연결하고 tty 장치에서 열린 파일 설명자를 다시 열도록 할 수 있습니다 /dev/null
. 다음과 같습니다(여기서는 stdout에만 해당).
gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid"
(애플리케이션이 동적으로 링크되어 있거나 디버그 기호가 있다고 가정하고 일부 시스템에는 이를 방지하는 보안 제한 사항이 있다는 점에 유의하십시오.)
동적으로 연결된 애플리케이션의 경우 LD_PRELOAD
SIGTTOU에 처리기를 설치하고 실행하는 Blob을 사용하여 실행하고 stty tostop
터미널에 액세스하려는 경우 stdout 및 stderr을 다시 열 수 있습니다. /dev/null
이는 stdout/stderr을 통해 터미널에 쓰는 비 setuid/setgid 애플리케이션의 경우를 처리하며 SIGTTOU 자체는 처리하지 않습니다.
달리기:
gcc -Wall -shared -fPIC -nostartfiles -o ~/lib/handle_tostop.so handle_tostop.c
여기에는 다음이 handle_tostop.c
포함됩니다.
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
static void reopen_on_null(int req_fd)
{
int fd;
if (close(req_fd) == 0) {
fd = open("/dev/null", O_RDWR);
if (fd != req_fd && fd >= 0) {
dup2(fd, req_fd);
close(fd);
}
}
}
static void handle_sigttou(int sig)
{
if (isatty(1)) reopen_on_null(1);
if (isatty(2)) reopen_on_null(2);
}
void _init()
{
signal(SIGTTOU, handle_sigttou);
}
그런 다음:
LD_PRELOAD=~/lib/handle_tostop.so
export LD_PRELOAD
stty tostop
대신 /dev/null
출력을 일부 로그 파일로 리디렉션할 수 있습니다(그런 다음 해당 로그 파일이 O_APPEND
유용하다면 버려지지 않을 것입니다).
답변2
당신이 사용하는 경우북면작업은 백그라운드에서 실행되지만 자동 출력(nohup.out)이 생성됩니다.