我不确定是否使用pty.fork()或os.fork()从我的应用程序生成外部后台进程.(如国际象棋引擎)
如果父节点被终止,我希望生成的进程死亡,就像在终端中生成应用程序一样.
两个叉子之间有什么起伏?
我正在寻找一个允许我强制杀死子进程的Java工具/包/库.
此工具/包/库必须在Windows平台上运行(必需).需要支持Linux/Unix.
我的Java代码创建了一个子进程,它根本不会对用于终止子进程的标准Java方法做出反应:process.destroy(),并且,由于我没有子进程的源代码,我无法对其进行编程以更好地处理终止请求.
我已经尝试在调用destroy()之前关闭子进程的错误输入和输出流,并且没有效果.
我甚至尝试将ctrlBreak信号(char = 3)直接传递给child.getOutputStream(),并再次收到相同的结果.
我终于找到的解决方法是:
在创建时获取子PID这可以通过在子项创建之前和之后区分进程列表在Windows中完成(getRuntime().exec("tasklist /v"))
使用子PID
在Windows中发出强制终止系统命令:getRuntime().exec("taskkill /pid " + childPid + " /f")
但是 - 这是复杂的代码我不想调试和维护,加上问题本身,我毫不怀疑,以前遇到过许多其他java开发人员,这让我希望这样的Java工具/包/库已经存在.
我只是不知道它的名字......
PS:我的子进程是由创建的Runtime.getRuntime().exec(cmd),但我使用ProcessBuilder得到了相同的行为.
我需要检查一下代码,Process.destroy()看看它kill在Linux上是一个什么样的子进程.
有谁知道这个方法的作用或链接到它的来源?我检查了jdk源代码,Process它只是一个抽象类,并且该destroy方法尚未实现,似乎没有链接到任何子类extends或者implements Process.任何帮助将不胜感激.
谢谢,
我之前在几个活动中使用了方法finish()没有问题.
但是当我试图在广播接收器内部调用它时,我从编译器得到错误消息"对于AudioService类型,方法finish()未定义"
AudioService是我的Android应用程序中的Service类的名称.
如果一个服务中没有finish()方法,那么我可以调用什么来杀死这个服务?
我使用crontask定期运行Rscript.不幸的是,我需要在一个小的aws实例上执行此操作,并且该过程可能会挂起,在彼此之上构建越来越多的进程,直到整个系统滞后.
我想写一个crontask来杀死持续时间超过一分钟的所有R进程. 我在Stack Overflow上找到了另一个答案,我已经调整过,我认为可以解决这个问题.我想出来了;
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1m "/usr/lib/R/bin/exec/R --slave --no-restore --file=/home/ubuntu/script.R";fi
Run Code Online (Sandbox Code Playgroud)
我直接从htop复制了任务,但它没有按照我的预期工作.我收到No such file or directory错误,但我已经检查了几次.
我需要杀死持续时间超过一分钟的所有R进程.我怎样才能做到这一点?
我想捕获从Script-A.sh发送到Script-B.sh的信号,所以在Script-A.sh中我使用命令
(将SIGINT发送到Script-B.sh)
kill -2 $ PID_Script-B.sh
在Script-B.sh中,我捕获信号并调用函数Clean
陷阱'清洁'2
它不起作用,而是立即杀死Script-B.sh而不执行Clean !!
我还注意到,如果我想将SIGINT从终端发送到任何捕获它的脚本,ctrl-c将会正确捕获,但如果我通过命令指定信号则不会kill -2 $pid_of_script
有没有想过发送SIGINT(ctrl-cVS kill -2 $pid_of_script)的两种方法之间的区别,以及如何将SIGINT从脚本发送到另一个?
问候,
调试器
我有一个并行化的自动化脚本,需要调用许多其他脚本,其中一些脚本因为(错误地)等待标准输入或等待各种其他不会发生的事情而挂起.这不是什么大不了的事,因为我抓住那些惊慌失措的人.诀窍是在孩子关闭时关闭那些悬挂的孙子进程.我认为各种各样的咒语SIGCHLD,等待和过程小组都可以做到这一点,但是它们都会阻止而且孙子孙女都没有收获.
我的解决方案有效,但似乎不是正确的解决方案.我对Windows解决方案还不是特别感兴趣,但我最终也需要它.我的只适用于Unix,现在还可以.
我写了一个小脚本,它可以运行同时并行的子节点数和fork的总数:
$ fork_bomb <parallel jobs> <number of forks>
$ fork_bomb 8 500
Run Code Online (Sandbox Code Playgroud)
这可能会在几分钟内达到每用户进程限制.我发现的许多解决方案只是告诉你增加每用户进程限制,但我需要这个运行大约300,000次,所以这不会起作用.同样,重新执行等建议以清除流程表并不是我需要的.我想实际修复问题,而不是在它上面拍打胶带.
我抓取进程表寻找子进程并在处理程序中单独关闭挂起的进程SIGALRM,这需要死掉,因为其余的实际代码在此之后没有成功的希望.从性能角度来看,kludgey爬过进程表并不会让我烦恼,但我不介意不这样做:
use Parallel::ForkManager;
use Proc::ProcessTable;
my $pm = Parallel::ForkManager->new( $ARGV[0] );
my $alarm_sub = sub {
kill 9,
map { $_->{pid} }
grep { $_->{ppid} == $$ }
@{ Proc::ProcessTable->new->table };
die "Alarm rang for $$!\n";
};
foreach ( 0 .. $ARGV[1] )
{
print ".";
print "\n" unless $count++ % 50;
my $pid = $pm->start and next;
local …Run Code Online (Sandbox Code Playgroud) 我有一个具有单个根Activity的应用程序.我最近引起了我的注意,任何一种强制关闭我的活动导致它重新启动,我不知道为什么会发生这种情况.如果我强制执行未捕获的异常或使用"长按后强制关闭"选项,它们都会产生相同的结果.
我唯一的猜测是某种形式的怪癖与保留对Activity的某些部分的引用有关,只有我在应用程序级别没有任何一些WeakReference条目.
相关的logcat条目:
05-25 08:25:49.137: INFO/ActivityManager(18449): Displayed uk.co.randomicon.rstb/.TreeBuilderActivity: +8s82ms
05-25 08:25:54.222: DEBUG/dalvikvm(18546): GC_EXPLICIT freed 12K, 57% free 3640K/8327K, external 8323K/10136K, paused 72ms
05-25 08:25:55.373: WARN/InputManagerService(18449): Got RemoteException sending setActive(false) notification to pid 19122 uid 10069
05-25 08:25:59.217: DEBUG/dalvikvm(18646): GC_EXPLICIT freed 128K, 48% free 2980K/5703K, external 0K/0K, paused 67ms
05-25 08:26:00.238: DEBUG/dalvikvm(18991): GC_CONCURRENT freed 343K, 51% free 2794K/5639K, external 303K/532K, paused 3ms+3ms
05-25 08:26:02.950: INFO/Process(18449): Sending signal. PID: 19554 SIG: 9
05-25 08:26:02.980: INFO/ActivityManager(18449): Process uk.co.randomicon.rstb (pid 19554) has died.
05-25 …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Android应用程序.现在我要去应用程序应该杀死进程的部分.但我不知道它的全名或它的PID.我知道命令:
android.os.Process.killProcess(Pid)
Run Code Online (Sandbox Code Playgroud)
和
android.os.Process.getUidForName("com.android.email")
Run Code Online (Sandbox Code Playgroud)
但我的问题是我不知道该过程的全名.
这是一个本机代码进程,所以不像com.something.something
这个过程是 /data/data/com.something.something/mybinary
但它运行的命令如
/data/data/com.something.something/mybinary -a 123 -b 456
Run Code Online (Sandbox Code Playgroud)
因为这个我不能用
android.os.Process.getUidForName("/data/data/com.something.something/mybinary")
Run Code Online (Sandbox Code Playgroud) 我正试图从终端控制台终止iOS模拟器(需要在Jenkins中集成自动UI测试),但每次我尝试命令时:
killall SimulatorBridge
Run Code Online (Sandbox Code Playgroud)
显示等待操作的提示:

问题是模拟器在获取提示操作之前不会被解雇.如何摆脱它?