您可以使用命令lsof来获取所有正在运行的进程的文件描述符,但我想要做的是关闭其中一些描述符,而不是在该进程内部.这可以在Windows上完成,因此您可以轻松取消阻止某些应用程序.
那有什么命令或功能吗?
我正在尝试在Linux上的Jetty 7.0.1中运行的Java webapp中调试文件描述符泄漏.
由于打开的文件过多而导致请求开始失败,应用程序已经愉快地运行了一个月左右,并且必须重新启动Jetty.
java.io.IOException: Cannot run program [external program]: java.io.IOException: error=24, Too many open files
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at java.lang.Runtime.exec(Runtime.java:593)
at org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58)
at org.apache.commons.exec.DefaultExecutor.launch(DefaultExecutor.java:246)
Run Code Online (Sandbox Code Playgroud)
起初我认为问题在于启动外部程序的代码,但它使用的是commons-exec,我没有看到它有什么问题:
CommandLine command = new CommandLine("/path/to/command")
.addArgument("...");
ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream();
Executor executor = new DefaultExecutor();
executor.setWatchdog(new ExecuteWatchdog(PROCESS_TIMEOUT));
executor.setStreamHandler(new PumpStreamHandler(null, errorBuffer));
try {
executor.execute(command);
} catch (ExecuteException executeException) {
if (executeException.getExitValue() == EXIT_CODE_TIMEOUT) {
throw new MyCommandException("timeout");
} else {
throw new MyCommandException(errorBuffer.toString("UTF-8"));
}
}
Run Code Online (Sandbox Code Playgroud)
在服务器上列出打开的文件我可以看到大量的FIFO:
# lsof -u jetty
... …Run Code Online (Sandbox Code Playgroud) 我想在Linux中找到为进程打开的所有fds.
我可以使用glib库函数吗?
已经问了类似的问题,但删除了它,因为我认为我修好了,但我错了.
我在我的一个Web项目中使用Play框架.Play不会呈现主页或不返回某些静态内容文件.
第一个屏幕截图显示了firebug控制台,当服务主页时,网站的加载停留在开头.
第二个屏幕截图显示fiddler控制台,当2个静态资源未加载时.

最初应用程序运行正常,它必须工作5-7天,我可以看到这个问题.它很难重现,它发生在15次中,我必须删除缓存数据并重新加载页面.(在FF中按CRTL-F5).问题可以在不同机器和操作系统的大多数浏览器中重现.最初,我认为托管服务提供商存在一些问题.但我已经改变了它,问题还没有消失.
该剧的版本是1.2.5.尝试了1.2.2.Play在CentOS-5-32位上作为独立服务器运行.
我怀疑,NettyPlay框架使用了一些问题.Play使用Netty 3.5.7最终jar.
cd /proc/28761/fd
ls -l | wc -l
337
Run Code Online (Sandbox Code Playgroud)
几天打开的文件描述符的数量从140增加到350.注意,开头和后面的网站平均负载是相同的.
我可以看到很多进程打开的套接字,以后不会发布.
lrwx------ 1 root root 64 Nov 11 10:34 300 -> socket:[1079566]
lrwx------ 1 root root 64 Nov 11 10:34 301 -> socket:[1079568]
lrwx------ 1 root root 64 Nov 11 10:34 302 -> socket:[1149958]
lrwx------ 1 root root 64 Nov 11 10:34 303 -> socket:[1160807]
lrwx------ 1 root root 64 Nov 11 10:34 304 -> socket:[1160605]
lrwx------ 1 root root 64 …Run Code Online (Sandbox Code Playgroud) 我配置一个作业停止和启动tomcat服务器时收到此错误:
处理泄露的文件描述符.有关更多信息,请参阅http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build
当我用谷歌搜索它时,我得到了一个推荐的解决方案,因为set BUILD_ID=dontKillMe
这是确切的解决方案吗?
如果是,我需要在哪里设置BUILD_ID?在ant/post构建脚本里面?
有人可以澄清一下吗?
当然,大多数情况下的直接答案是"是",我坚信一个进程应该正确清理它已经分配的任何资源,但我在我的情况下拥有的是一个长期运行的系统守护进程,它打开一个固定的启动时的文件描述符数量,并在退出前将它们全部关闭.
这是一个嵌入式平台,我正在努力使代码尽可能紧凑,同时不引入任何不良风格.但是,由于文件描述符无论如何都会在退出之前关闭,这个文件描述符清理代码是否可以用于任何目的?你总是关闭所有文件描述符吗?
我正在寻找STDIN从外部进程向现有进程写入数据的方法,并发现了类似的问题 如何将数据从Python中的不同本地/远程进程流式传输到程序的STDIN中?在stackoverlow中.
在那个帖子中,@ Michael说我们可以在下面的路径中获取现有进程的文件描述符,并允许在Linux上将数据写入其中.
/proc/$PID/fd/
Run Code Online (Sandbox Code Playgroud)
所以,我创建了一个下面列出的简单脚本来测试从外部进程向脚本STDIN(和TTY)写入数据.
#!/usr/bin/env python
import os, sys
def get_ttyname():
for f in sys.stdin, sys.stdout, sys.stderr:
if f.isatty():
return os.ttyname(f.fileno())
return None
if __name__ == "__main__":
print("Try commands below")
print("$ echo 'foobar' > {0}".format(get_ttyname()))
print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid()))
print("read :: [" + sys.stdin.readline() + "]")
Run Code Online (Sandbox Code Playgroud)
这个测试脚本显示的路径STDIN和TTY,然后,等待一个写它STDIN.
我启动了这个脚本并在下面收到了消息.
Try commands below
$ echo 'foobar' > /dev/pts/6
$ echo 'foobar' > /proc/3308/fd/0
Run Code Online (Sandbox Code Playgroud)
所以,我执行的命令echo 'foobar' …
我是Android编程的新手并且发现自己陷入困境我一直在研究各种方法从手机到手机直播视频直播,似乎主要是功能性的,当然除了最重要的部分:播放流.它似乎是从一部手机发送流,但第二部手机无法播放流.
这是播放方的代码
public class VideoPlayback extends Activity implements Callback {
MediaPlayer mp;
private SurfaceView mPreview;
private SurfaceHolder holder;
private TextView mTextview;
public static final int SERVERPORT = 6775;
public static String SERVERIP="192.168.1.126";
Socket clientSocket;
private Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreview = (SurfaceView) findViewById(R.id.surfaceView1);
mTextview = (TextView) findViewById(R.id.textView1);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mTextview.setText("Attempting to connect");
mp = new MediaPlayer();
Thread t = …Run Code Online (Sandbox Code Playgroud) android file-descriptor video-streaming media-player live-streaming
我不知道为什么我很难找到这个,但我正在查看一些linux代码,我们正在使用select()等待文件描述符来报告它已准备就绪.从选择的手册页:
select() and pselect() allow a program to monitor multiple file descriptors,
waiting until one or more of the file descriptors become "ready" for some
class of I/O operation
Run Code Online (Sandbox Code Playgroud)
所以,这很好......我在一些描述符上调用select,给它一些时间值并开始等待指示去.文件描述符(或描述符的所有者)如何报告它"准备好"以便select()语句返回?
如果由于某种原因,我发现我的程序中有一个致命的情况,我想退出错误代码.有时,致命错误的上下文超出了其他文件描述符的范围.关闭这些文件描述符是一个好习惯.据我所知,这些文件会在进程终止时自动关闭.