작성기 프로세스가 종료된 후 명명된 파이프에서 읽는 방법은 무엇입니까?

작성기 프로세스가 종료된 후 명명된 파이프에서 읽는 방법은 무엇입니까?

명명된 파이프를 비동기 작업 대기열(JMS와 유사할 수 있음)로 사용하고 싶습니다.

예를 들어, 클라이언트가 데이터베이스에 삽입하려는 일부 데이터를 보내지만 클라이언트가 즉시 서버 및 서버 프로세스와의 연결을 끊고 데이터를 명명된 파이프로 파이프하기를 원한다고 가정해 보겠습니다. 그런 다음 파이프에서 데이터를 읽고 완전히 독립적으로 SQL 삽입을 수행합니다. 이는 매우 느릴 수 있지만 클라이언트는 즉시 응답을 받기 때문에 이를 알아차리지 못합니다.

프로토타입으로는 이것이 작동한다고 생각합니다(단순화를 위해 netcat 클라이언트-서버 쌍을 통해 전송되는 대신 "45"가 에코됩니다).

zsh> nohup echo "45" > my_named_pipe &
zsh> exit
zsh: warning: 1 jobs SIGHUPed

그런 다음 훨씬 나중에 실행하십시오.

zsh> cat my_named_pipe

그러나 파이프에서는 아무것도 나오지 않았습니다. 설정에 문제가 있나요?

추신: 저는 nohup직업을 가져본 적이 없습니다. 이 경우 나는 항상 disown별도의 명령으로 수행하고 싶지 않은 작업에 의존합니다.

답변1

이 작업을 수행할 때:

nohup echo "45" > my_named_pipe &

껍질이 저절로 갈라집니다. 어린이에게는 my_named_pipe글쓰기가 가능합니다. 이는 다른 항목이 읽기 위해 open()열릴 때까지 차단됩니다 .my_named_pipe

exit상위 프로세스에서 실행 하면 하위 프로세스는 여전히 차단되어 open()아직 실행되지 않았습니다 nohup.

따라서 쉘을 종료한 후 쉘은 하위 프로세스에 SIGHUP 신호를 보냅니다. 이는 아직 실행 중이 아니기 때문에 무시하지 않습니다 nohup.

빨리 달려:

(echo 45 > my_named_pipe &)

또는 다음을 사용하여 zsh:

echo 45 > my_named_pipe &!

&!zsh는 구문 설탕입니다disown

BASH와 ZSH에는 모두 disown이라는 멋진 내장 기능이 있습니다. 이를 통해 사용자는 nohup과 유사한 방식으로 셸에서 프로세스를 분리할 수 있습니다. ZSH에는 좋은 설탕이 있습니다. &! 명령이 끝나면 분리됩니다. BASH에는 그런 설탕이 없습니다

http://blog.debiania.in.ua/posts/2013-03-13-fun-with-bash-disown.html

답변2

당신이 가진 문제와 그것이 쉘에 의존하는 이유는 >리디렉션이 먼저 처리되고 아직 파이프를 읽은 사람이 없으면 차단된다는 것입니다. 쉘은 열기가 성공한 후에만 실행됩니다 nohup. 아직 열려 있는 동안 연결을 끊었으므로 nohup아직 그런 일이 발생하지 않았고 SIGHUP백그라운드 프로세스가 종료되었습니다. 그래서 disown더 좋습니다. 작업에 즉시 효과가 있었습니다.

bash로 문제를 재현하려는 시도에 따르면 bash는 세션 종료 SIGHUP을 zsh처럼 하위 프로세스로 전달하지 않으므로 백그라운드 작업이 남아 있는 것 같습니다.

관련 정보