명명된 파이프를 비동기 작업 대기열(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처럼 하위 프로세스로 전달하지 않으므로 백그라운드 작업이 남아 있는 것 같습니다.