这些问题的过去答案都集中在分叉上:
对于这个问题,我只是询问对'系统'功能的调用.
假设我有一个名为sleep.pl的脚本:
use strict;
use warnings;
sleep(300);
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为kill.pl的脚本
use strict;
use warnings;
system("sleep.pl");
Run Code Online (Sandbox Code Playgroud)
我运行kill.pl并使用ps我找到kill.pl的进程ID并杀死它(不使用kill -9,只是普通的kill)
sleep.pl还在睡觉.
我想我的问题的解决方案涉及一个SIG处理程序,但是我需要将什么内容放入处理程序来杀死子进程?
我在perl中创建了一个脚本来运行超时的程序.如果正在执行的程序需要更长的时间,那么超时将比脚本终止该程序并返回消息"TIMEOUT".
脚本工作得很好,直到我决定重定向执行程序的输出.
当stdout和stderr被重定向时,脚本执行的程序没有被杀死,因为它的pid与我从fork获得的pid不同.
似乎perl执行一个shell,在重定向的情况下执行我的程序.
我想有输出重定向但仍能够在超时的情况下终止程序.
有关如何做到这一点的任何想法?
我的脚本的简化代码是:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX ":sys_wait_h";
my $timeout = 5;
my $cmd = "very_long_program 1>&2 > out.txt";
my $pid = fork();
if( $pid == 0 )
{
exec($cmd) or print STDERR "Couldn't exec '$cmd': $!";
exit(2);
}
my $time = 0;
my $kid = waitpid($pid, WNOHANG);
while ( $kid == 0 )
{
sleep(1);
$time ++;
$kid = waitpid($pid, WNOHANG);
print "Waited $time sec, result $kid\n";
if ($timeout > 0 && …Run Code Online (Sandbox Code Playgroud) 使用#有很多好的 理由!在/ usr/bin中/ env的.底线:它使您的代码更具可移植性.好吧,有点儿.看一下这个....
我有两个几乎相同的脚本, bintest.py
#! /usr/bin/python
import time
time.sleep(5*60)
Run Code Online (Sandbox Code Playgroud)
和 envtest.py
#! /usr/bin/env python
import time
time.sleep(5*60)
Run Code Online (Sandbox Code Playgroud)
请注意,他们只是在他们的shebangs不同.
bintest.py 按预期运行
br@carina:~$ ./bintest.py & ps && killall bintest.py [1] 15061 PID TTY TIME CMD 14625 pts/0 00:00:00 bash 15061 pts/0 00:00:00 bintest.py 15062 pts/0 00:00:00 ps br@carina:~$ [1]+ Terminated ./bintest.py
但envtest.py做的事情不是最优的
br@carina:~$ ./envtest.py & ps && killall envtest.py [1] 15066 PID TTY TIME CMD 14625 pts/0 00:00:00 bash 15066 pts/0 00:00:00 python 15067 …
如何使用Delphi杀死其他机器(通过网络)的运行进程?
如何在不杀死eclipse中启动的应用程序的情况下退出Eclipse?我知道在调试模式下启动的应用程序与Eclipse有一个网络链接,但在发布模式下启动的应用程序应该没有问题.但是,无论我如何结束eclipse(甚至杀死进程)都会在几秒钟后杀死已启动的应用程序,无论这些程序中的重要未保存数据如何.
动机?可以是任何:eclipse内部错误请求重启,需要释放更多内存(eclipse是330MiB),由进程资源管理器意外杀死.
90%的时间我总是得到堆栈跟踪.但有时这个过程就会退出,我不明白为什么.无论如何总是打印堆栈跟踪?或者在dmesg中找到更多信息?
在终止风暴拓扑之前如何调用特定方法。
我已经在风暴中创建了一个拓扑,我想在拓扑被杀死之前调用特定的方法。
在Storm框架中是否有任何预定义的替代方法或任何可用的方法来做到这一点。
提前致谢:)
客户端完成后,该过程将自动关闭。我想在服务器端执行相同的操作,因为我想使某些进程自动化,但是服务器端完成但仍保持打开状态。
在bash中,我可以pid通过$!变量获取最后一个子进程的进程ID()。然后,我可以在此子进程完成之前将其杀死:
(sleep 5) & pid=$!
kill -9 $pid
Run Code Online (Sandbox Code Playgroud)
这工作如广告。如果现在我在之后用更多命令扩展子流程,即使其他命令从未执行过sleep,该sleep命令也会在子流程被杀死后继续执行。
例如,考虑以下内容,它启动一个子流程并使用监视其暗杀ps:
# Start subprocess and get its pid
(sleep 5; echo done) & pid=$!
# grep for subprocess
echo "grep before kill:"
ps aux | grep "$pid\|sleep 5"
# Kill the subprocess
echo
echo "Killing process $pid"
kill -9 $pid
# grep for subprocess
echo
echo "grep after kill:"
ps aux | grep "$pid\|sleep 5"
# Wait for sleep to finish …Run Code Online (Sandbox Code Playgroud) 我的mongoDB总是在没有被访问的几个小时内收到KILL信号,我不知道原因.
我正在使用:
SO:Ubuntu 16.04,512MB内存.
在pm2中运行节点7.5.0.
MongoDB版本3.4.1
状态mongod:
mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: failed (Result: signal) since Fri 2017-06-02 06:25:06 BRT; 9h ago
Docs: https://docs.mongodb.org/manual
Process: 1334 ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf (code=killed, signal=KILL)
Main PID: 1334 (code=killed, signal=KILL)
May 29 19:12:16 admin systemd[1]: Started High-performance, schema-free document-oriented database.
Jun 02 06:25:06 admin systemd[1]: mongod.service: Main process exited, code=killed, status=9/KILL
Jun 02 06:25:06 admin systemd[1]: mongod.service: Unit entered failed state.
Jun 02 06:25:06 …Run Code Online (Sandbox Code Playgroud)