我想将命名管道用作异步任务队列(可能类似于JMS)。
例如,假设一个客户端发送了一些我想插入到数据库中的数据,但是我希望该客户端立即与服务器断开连接,并且服务器进程将这些数据通过管道传递到一个命名管道中。然后完全独立地从管道读取数据并执行SQL插入,这可能非常慢-但是客户端不会注意到,因为它会立即获得响应。
作为原型,我认为这可以工作(为简单起见,回显“ 45”,而不是通过netcat客户端-服务器对发送):
zsh> nohup echo "45" > my_named_pipe &
zsh> exit
zsh: warning: 1 jobs SIGHUPed
然后,很久以后,执行
zsh> cat my_named_pipe
但是,管道中没有任何东西。我的设置有什么问题?
PS:我从来没有nohup
上班。disown
在这种情况下,我始终依赖我不想作为单独命令执行的操作。
当您这样做时:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句