두 번째 프로세스를 종료하기 위해 파이프 "|"를 사용하는 이유는 무엇입니까? 이를 방지할 수 있는 방법이 있습니까?

두 번째 프로세스를 종료하기 위해 파이프 "|"를 사용하는 이유는 무엇입니까? 이를 방지할 수 있는 방법이 있습니까?

컨텍스트를 제공하기 위해 이 명령을 실행하려고 합니다.

echo "set hive.execution.engine=tez;" | hive

"set hive.execution.engine..."이 Hive 대화형 셸에 들어가면 Hive가 종료됩니다.

하이브 대화형 셸에 남아 있기를 원하지만 셸이 종료되고 일반 Linux 셸로 돌아갑니다.

답변1

완료되면 echo입력이 hive파일 끝에 도달하여 hive종료됩니다. 대화형 셸을 클릭 하면 Ctrl-D동일한 효과를 얻을 수 있습니다. 다음을 시도해 보십시오:

(echo "set hive.execution.engine=tez;" ; cat ) | hive

그러나 대화형 셸의 커서 이동 및 기타 유용한 기능이 손실될 수 있습니다.

편집하다:더 나은 접근 방식은 명령 set~/.hiverc하이브 문서.

답변2

입력 후 종료됩니다. 그러니 끝내지 마세요.

echo "set hive.execution.engine=tez;" | cat - /dev/tty | hive

처음부터 없었던 기능은 손실되지 않습니다. 이는 연결의 catstdin을 통해 달성됩니다.(이것은 echo표준 출력입니다)터미널로부터의 입력으로. 이것은 매우 간단합니다. cat여기의 또 다른 솔루션은 최상위 대화형 셸에서 실행하는 한 동일한 방식으로 작동합니다.

답변3

다음 내용이 도움이 될지는 모르겠지만 만일을 대비해 몇 가지 조사를 해봤습니다.

다음과 같이 구현할 수 있습니다(귀하의 명령에는 적용할 수 없음).

if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
  perror(0);
  exit(1);
}

그러나 에 대해서는 signal더 이상 사용되지 않습니다.

더 나을 수도 있다

struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGPIPE, &sa, 0) == -1) {
  perror(0);
  exit(1);
}

출처 및 추가 정보:
손상된 파이프에 쓰는 동안 프로세스가 종료되지 않도록 방지 그리고
프로세스의 다른 스레드에 영향을 주지 않고 SIGPIPE를 무시합니다.

관련 정보