출력하지 않고 백그라운드에 작업을 넣는 방법은 무엇입니까? [복사]

출력하지 않고 백그라운드에 작업을 넣는 방법은 무엇입니까? [복사]

command 를 사용하여 작업을 백그라운드에 넣을 때 job 명령의 출력이 있습니다 bg.

bg명령 과 같이 백그라운드에 작업을 배치하지만 출력이 없는 방법은 무엇입니까 ?

>/dev/null 2>1추신: 작업은 출력이 있는 명령에 연결됩니다(원래 명령에는 없음)

답변1

tty 장치에 쓰기를 중지하려면 현재 백그라운드에 있는 애플리케이션에 알려야 합니다. 이를 수행하는 보편적인 방법은 없습니다.

넌 할 수있어:

stty tostop

SIGTTOUtty에 쓰려고 할 때 백그라운드 작업이 (신호와 함께) 일시 중단됩니다 .

디버거를 프로세스에 연결하고 tty 장치에서 열린 파일 설명자를 다시 열도록 할 수 있습니다 /dev/null. 다음과 같습니다(여기서는 stdout에만 해당).

gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid"

(애플리케이션이 동적으로 링크되어 있거나 디버그 기호가 있다고 가정하고 일부 시스템에는 이를 방지하는 보안 제한 사항이 있다는 점에 유의하십시오.)

동적으로 연결된 애플리케이션의 경우 LD_PRELOADSIGTTOU에 처리기를 설치하고 실행하는 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)이 생성됩니다.

관련 정보