相关疑难解决方法(0)

为什么只读打开命名管道块?

在使用Python在各种UNIX(Linux,FreeBSD和MacOS X)下处理命名管道(FIFO)时,我注意到了一些奇怪的事情.第一个,也许是最烦人的是尝试打开空闲/空闲FIFO只读将被阻止(除非我使用os.O_NONBLOCK较低级别的os.open()调用).但是,如果我打开它进行读/写,那么我就不会阻塞.

例子:

f = open('./myfifo', 'r')               # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY)    # ditto

# Contrast to:
f = open('./myfifo', 'w+')                           # does NOT block
f = os.open('./myfifo', os.O_RDWR)                   # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK)   # ditto
Run Code Online (Sandbox Code Playgroud)

我只是好奇为什么.为什么打开调用块而不是后续的一些读操作?

另外我注意到非阻塞文件描述符可以表现为Python中的不同行为.在我使用的情况下os.open()os.O_NONBLOCK初始开启操作那么os.read()似乎如果数据还没有准备好文件描述符返回一个空字符串.但是,如果我使用fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)然后os.read引发异常(errno.EWOULDBLOCK)

是否有一些其他标志open()由我的os.open()例子未设置的法线设置?它们有什么不同,为什么?

file-io posix nonblocking named-pipes fifo

57
推荐指数
1
解决办法
2万
查看次数

BASH:从两个输入流中读取的最佳架构

这里简单的脚本:

a)不断从套接字读取并在关联数组中存储值
b)不断从stdin读取值并在关联数组中已存在时响应t/f

a&b是随机事件,不以任何方式关联.

诀窍是从两个子进程访问数组(因为在后台放置一个进程会将其作为子进程生成)

我正在考虑最好的策略,并且会出现一些想法,但我想知道是否有人有更好的想法:

1)将输入从套接字重定向到stdin作为子进程并在一个while循环中处理两个输入(数据大小很小,<30个字符,所以我猜它们将保持原子?).
2)读取套接字,然后在读取时使用小(0.1?)超时值读取STDIN,以模仿非阻塞I/O.
3) UPDATE:将套接字数据写入文件(实际上让其他进程将其直接写入文件),然后每次请求进入以检查该值是否存在时,处理文件中的条目,将它们添加到文件中.数组(使用文件锁定).

linux io bash multithreading subprocess

5
推荐指数
1
解决办法
1941
查看次数

记录到非阻塞命名管道?

我有一个问题,我无法在stackoverflow或网络上的任何地方找到帮助.

我有一个程序(芹菜分布式任务队列),我有多个实例(工人),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log).

重要的错误存储在数据库中,但我喜欢在运行新操作时不时地拖尾这些日志以确保一切正常(loglevel更低).

我的问题:这些日志占用了大量磁盘空间.我想做什么:能够只在我需要时"观察"日志(tail -f),而不需要占用大量空间.

我的想法到现在为止:

  • 输出日志到stdout,而不是文件:这里不可能,因为我有很多工人输出到不同的文件,但我想一次拖尾它们(tail -f celery_worker*.log)
  • 使用logrotate:对我来说这是一个"OK"的解决方案.我不希望这是一个日常任务,但宁愿不为此花一分钟crontab,而且更多,服务器不是我的,所以这意味着在admin-sys方面的一些工作
  • 使用命名管道:它一见钟情,但我不知道命名管道(linux FIFO)阻塞.因此,当我不同时尾随-f所有管道,或者当我刚退出尾部时,记录器的写入操作被阻止.

有没有办法有一个非阻塞的命名管道,它会在尾部时抛出stdout,并在没有时抛出/ dev/null?

或者这种管道有技术难题吗?如果有,他们是什么?

谢谢您的回答!

linux bash logging pipe fifo

5
推荐指数
1
解决办法
2068
查看次数