当前位置: 首页 > 知识库问答 >
问题:

在Android中优雅地杀死Java打开的进程

梁丘霖
2023-03-14

我试图在我的Android应用程序中执行ping命令,并能够取消它/发送中断信号。基本上,我希望在任何普通的linux中,当你发送ctrl c到ping时,都能得到ping统计数据。我读过Send Ctrl-C to process open by Java,但它针对的是Windows平台,而tbh似乎有点过头了。我执行命令的代码(我使用的是rxjava):

public rx.Observable<String> getPingOutput(String address)
{
    return rx.Observable.create(new rx.Observable.OnSubscribe<String>()
    {
        @Override
        public void call(Subscriber<? super String> subscriber)
        {
            try
            {
                process = Runtime.getRuntime().exec("ping -c 4 " + address);
                BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String s;
                while ((s = stdInput.readLine()) != null)
                {
                    subscriber.onNext(s);
                }
                subscriber.onCompleted();
                process.destroy();
                stdInput.close();
            }
            catch (IOException e)
            {
                subscriber.onError(e);
                if(process != null)
                {
                    process.destroy();
                }
            }
        }
    });
}

以及开始/取消:

RxView.clicks(pingButton)
                .subscribe(new Action1<Void>()
                {
                    @Override
                    public void call(Void aVoid)
                    {
                        if (isPingInProgress())
                        {
                            process.destroy();
                            subscription.unsubscribe();
                            isPing = false;
                            pingButton.setText("Ping");
                        }
                        else
                        {
                            if(adapter!= null)
                            {
                                adapter.clear();
                                adapter.notifyDataSetChanged();
                            }
                            String address = addressInput.getText().toString();
                            subscription = getPingOutput(address)
                                    .subscribeOn(Schedulers.newThread())
                                    .observeOn(AndroidSchedulers.mainThread())
                                    .subscribe(myObserver);
                            isPing = true;
                            pingButton.setText("Stop");
                        }
                    }
                });

到目前为止,我试图终止进程,但这会立即停止所有输出。我该如何“优雅地”停止Android中Java启动的ping命令呢?

编辑

所以我设法得到了pinghtml" target="_blank">过程的PID,通过adb控制台验证了它的正确性。我试图用:Runtime杀死它。getRuntime()。exec(“kill-INT”getPid(process));,没有ErrorStream输出,但什么也没有发生。过程也是如此。sendSignal(getPid(进程),进程。发出退出的信号;。任何人

共有1个答案

韩单弓
2023-03-14

问题解决了,结果它对信号没有反应,因为我在不同的线程上运行了ping。

 类似资料:
  • 问题内容: 我正在使用popen()打开一个长期运行的过程。对于调试,我想在完成之前终止该过程。调用pclose()只会阻塞直到子项完成。 我如何杀死这个过程?我没有找到任何简单的方法来从popen()返回的资源中获取pid,以便可以向其发送信号。 我想我可以做些杂乱的事情,并尝试使用某种命令行黑客将pid混入输出中… 问题答案: 好了,找到了一个解决方案:我改回而不是。然后就这么简单:

  • 问题内容: 我创建了一个.NET Core控制台应用程序,该应用程序在Ubuntu 14.04计算机上作为守护程序运行。 我想停止服务而不强制它,因为它能够处理kill事件。 我该如何实现? 问题答案: 您希望能够将 SIGTERM 发送到正在运行的进程: 并且该进程应处理它以正确关闭。 不幸的是, .NET Core的 文档不完善,但是它能够处理Unix信号(与 Mono的 方式不同)。GitH

  • 问题内容: 我想知道如何“杀死”已启动的过程。我知道Process API,但是不确定,是否可以使用它来杀死已经运行的进程,例如firefox.exe等。如果可以使用Process API,可以请您指向正确的方向?如果没有,还有哪些其他可用选项?谢谢。 问题答案: 如果你从Java应用程序中以从头开始处理(例如,通过调用或),那么你将对其具有有效的引用,并且可以在Process类中调用该方法以终止

  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是强行杀死(或),然后它们将不会执行。

  • 问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其

  • 问题内容: 考虑这一行: 显然,这行是潜在的错误,属性可能是,我们将获得。因此,我们需要将其重构为以下两种选择之一: 第一种选择: 第二种选择: 第一种选择阅读时比较笨拙,但更为简洁;第二种选择的意图很明确,但很冗长。 就可读性而言,您更喜欢哪个选项? 问题答案: 我一直都在用 因为尽管阅读起来有点困难,但是它的冗长程度要小得多,而且我认为它足够易读,因此您可以很容易地习惯它