我有一个在Linux服务器的背景上运行的脚本,我想捕获重新启动或任何会杀死此脚本的信号,而是在实际退出之前保存任何重要的信息. 我认为我需要抓住的大部分是sigint,sigterm,sighup,sigkill. 如何捕获这些信号中的任何一个并执行退出功能,否则继续执行它的工作? 伪perl代码: #!/usr/bin/perl use stricts; use warnings; while (true) { #my happy code is running #my happy code will sleep for a few until its breath is back to keep running. } #ops I have detected an evil force trying to kill me #let's call the safe exit. sub safe_exit() { # save st
以下是关于 signals 的编程技术问答
我已经看到很多人说Symfony2,Zend Framework 2和其他人是事件驱动的. 在桌面世界上,通过事件驱动的编程,我了解该应用程序会在其状态更改时通知其观察者. 由于PHP应用程序是没有国家的应用程序,因此无法做此类事情. IE.在用户使用接口时,让观察者与视图绑定的观察器绑定.相反,它需要一个新的请求过程才能更新视图.因此,不是一个事件,而是一个全新的请求. 另一方面也有类似的概念:事件驱动的体系结构. 在这里您可以同时阅读: 和另一个: http://en.wikipedia.org/wiki/signal_programming 信号是事件发生的过程的通知. 信号有时被描述为软件中断.信号是 类似于硬件中断,因为它们会中断正常 程序的执行流;在大多数情况下,不可能 准确预测信号何时到达. stackoverflow [singals]标签描述 此外,我以前称之为事件驱动的内容似乎与QT(观察者模式实现)介绍的信号和插
我有一个独立的php脚本,我会处理从Windows OS发送的信号,以在发出"杀死信号"时进行正式关闭. 我该如何在Windows上执行此操作? 解决方案 2020年3月更新:截至7.4 php 7.4, sapi_windows_set_set_ctrl_handler() and sapi_windows_generate_ctrl_event .这使您的脚本可以处理CTRL+C和CTRL+Break Keypresses,并为同一过程组中的其他过程生成它们. proc_open()也添加了create_process_group选项允许儿童过程处理CTRL事件.就信号处理而言,这是您可以在窗口上做的最好的.请注意,这些功能仅适用于PHP CLI SAPI(即php.exe),并且它们仅在将过程附加到控制台上时起作用,这在某种程度上限制了它们的有用性. 原始答案: 虽然这里唯一的其他答案是简洁而准确的,但它缺乏有关为什么在Windows上没有信号支持的细节.
我目前正在寻找有关如何在Android上操纵音频的选项.目标是在电话中实时从麦克风实时处理音频.最好的解决方案是在本机通话中这样做.但是重建电话应用程序(无VOIP)也可以.有什么方法可以使用Android API(也没有证件)来实现这一目标? 如果不是,则需要哪些步骤才能运行? 在iOS上,有一些操纵语音但创建VoIP连接的应用程序.我听说您可以在Android上"克隆"电话应用程序,并最终用自己的音频流进行喂食吗?没有在通话过程中添加声音的应用程序吗?涉及哪种API? 解决方案 最好的解决方案是在本机呼叫上执行此操作. 这是不可能的.您无法访问呼叫音频流,除了以扬声器电话模式. 但是重建电话应用程序(无VOIP)也可以. Google(2010)的最后一个官方单词,整个操作系统都无法访问呼叫音频流,因为它们均以较低的级别处理.即使Android的较新版本确实可以访问"呼叫音频"流,也只有在创建自定义固件时才可以使用"重建电话应用". 其他解决
设置: 内核:4.1.16-V7+ OS:ARMV7L GNU/Linux(主要是Debian) This is perl 5, version 20, subversion 2 (v5.20.2) built for arm-linux-gnueabihf-thread-multi-64int 较大的Perl代码具有外部过程的一部分,有时在某个时间表中不会响应.当此错误发生时,"主"子例程将通过signal_handler命令" restartservice"重新启动 在调试此问题时,我发现了许多有关信号处理的描述,尤其是在使用信号处理程序的情况下. 和 http://wwwww.perlmonks.org/?node_id = 440900 P> Qouting: 并非所有平台都会在信号传递后自动重新安装其(本机)信号处理程序.这意味着处理程序仅在发送信号的第一次>时工作.解决此问题的解决方案是使用" POSIX">信号处理程序,如果可用,其行为定义明确
我正在阅读我们如何捕获Ctrl ^ c -Perl Monks ,但是我似乎无法获取正确的信息来帮助解决我的问题. 事实是 - 我有一个无限的循环,"多行"打印输出到终端(我知道我会被告知使用ncurses - 但是对于简短的脚本,我更舒服写一堆printf s ).我想以这样的方式捕获Ctrl-C,以至于脚本仅在此多行打印输出完成后才终止. 脚本为(Ubuntu Linux 11.04): #!/usr/bin/env perl use strict; use warnings; use Time::HiRes; binmode(STDIN); # just in case binmode(STDOUT); # just in case # to properly capture Ctrl-C - so we have all lines printed out # unfortunately, none of this works: my $toex
我刚刚阅读了leon timmermans的文章 1)首先,似乎timeout_call()使用longjmp和不安全的信号,因此证书安全编码规则Sig32-C 是适用的. 2)如果监视超时的代码仅包含纯perl代码(即没有呼叫XS模块)? ,可以安全使用? 解决方案 1)timeout_call()使用几乎完全相同的成语将系统调用与Leon的示例包裹在eval/alarm块中: my $ALARM_EXCEPTION = "alarm clock restart"; my $h; eval { $h = set_sig_handler('ALRM', sub { die $ALARM_EXCEPTION }, { }); alarm 10; flock $fh, 2 or die "cannot flock: $!"; alarm 0; }; alarm 0; $SIG{ALRM} = $h; if ($@ && $@ !~ quo
我已经编写了以下代码,以测试孩子和父母之间的信号.理想情况下,当孩子向父母提供SIGINT时,父母应该回到新的迭代中并等待用户输入.我在Perl 5.8中观察到了这一点,但是在Perl 5.6.1(我被要求使用)中,父母实际上是"杀死的".没有下一个迭代. my $parent_pid = $$; $pid = fork(); if($pid == 0) { print "child started\n"; kill 2, $parent_pid; } else { while(1) { eval { $SIG{INT} = sub{die "GOTCHA";}; print 'inside parent'."\n"; $a = ; }; if($@) { p
在Solaris 9(SPARC)上的Chroot环境中运行Perl时,我遇到了一些奇怪的错误.我们是使用自定义Perl的,但它几乎完全是Perl 5.8.7,并且此版本已经在包括Solaris 8-10在内的各种平台上运行了多年. 以下代码非常简单: #!/usr/bin/perl use strict; use warnings; print "About to sleep(1)\n"; sleep 1; print "Just woke up!\n"; 但是,如果我运行的话,"醒了!"永远不会打印 - 相反,程序结束,"闹钟"回荡在屏幕上.只有在睡觉时才发生 - 如果我编写了一个可以做很多数学的程序并且需要10秒钟的时间才能运行,一切正常.它也只发生在Chroot环境中. 我已经倾倒了%sig,它的条目为" alrm => undef",这是可以预期的 - 非卫生环境具有相同的行为.但是,如果我将脚本更改为: $SIG{ALRM} = sub {};
我有一些建立信号处理程序的perl代码: $SIG{'KILL'} = sub { .... }; 我的任务是将其移植到Windows,我想知道如何从C#类生成此信号. 我在System.Diagnostics.Process类中看到了Process.Kill方法,它似乎允许我创建(通过另一种方法)并杀死我的过程,但是我无法弄清楚如何将信号发送到Perl脚本. 解决方案 您可能会在想TERM信号处理程序,因为KILL无法捕获.无论如何,Windows不使用信号,虽然您可以使用它们,但它仅在一个线程中,而不会向其他过程发送信号. 您还有其他各种IPC机制,这是要求另一个进程优雅地退出的通常是PostMessage(WM_QUIT),但这实际上仅适用于Perl脚本通常不是的图形应用程序. Windows上的一种受支持的方法将用于创建事件(带有可继承的标志)并将其传递给子进程的过程,将其放入环境中对于Perl来说非常方便.然后,孩子可以对事件进行诉讼.
由于Perl 5.10.1:Sigint被困. #!/usr/bin/perl use strict; use warnings; $SIG{INT} = sub { die "Caught a sigint $!" }; sleep(20); 但这里的sigint是 不是 被困. #!/usr/bin/perl use strict; use warnings; $SIG{INT} = sub { die "Caught a sigint $!" }; END { sleep(20); } 可以通过在END块中再次设置处理程序来解决此问题,例如: END { $SIG{INT} = sub { die "Caught a sigint $!" }; sleep(20); } ,如果您有一个以上的街区,那将无法工作:每个块必须再次设置处理程序. 我试图解决这个问题,我找不到 实用的Perl编程 A D Ma
当孩子的过程从终端接收SIGINT时,我会从system()中遇到一些奇怪的回报值.为了解释,从perl脚本parent.pl我使用system()将另一个perl脚本作为子过程运行,但是我也需要通过shell来运行孩子,所以我使用了system 'sh', '-c', ... form.孩子的过程成为sh过程,sh过程的父母变成了parent.pl.另外,为避免让接收SIGINT信号的sh过程,我将其捕获. 例如,parent.pl: use feature qw(say); use strict; use warnings; for (1..3) { my $res = system 'sh', '-c', "trap '' INT; child$_.pl"; say "Parent received return value: " . ($res >> 8); } 其中child1.pl: local $SIG{INT} = "DEFAULT
在C中,我可以说 #include #include #include int continue_running = 1; void handler(int signal, siginfo_t* info, void* data) { printf("got signal %d from process %d running as user %d\n", signal, info->si_pid, info->si_uid); continue_running = 0; } int main(int argc, char** argv) { struct sigaction sa; sigset_t mask; sigemptyset(&mask); sa.sa_sigaction = &handler; sa.sa_mask
这些设置有什么区别? $SIG{CHLD} = 'IGNORE' $SIG{CHLD} = 'DEFAULT' $SIG{CHLD} = '' $SIG{CHLD} = undef 根据" Unix环境中的高级编程,第二版",图10.1 sigchld的默认值是"忽略的". 如果"忽略"的意思是" sig_ign",那么没有孩子会成为僵尸,事实并非如此. 从那里尚不清楚: 如果该过程专门将其处置为Sig_ign,则 呼叫过程不会生成僵尸过程.注意 这与其默认操作(SIG_DFL)不同,该操作从数字 10.1将被忽略.相反,在终止时,这些子过程的状态 被丢弃. 我很难抓住各种值(或未定义的非价值)的影响.到目前为止,解决方案一直是旋转这些选择,直到我得到所需的行为为止,我宁愿准确地理解每个值如何定义信号的行为. 行为:一个子过程正在调用"系统"或使用创建另一个孩子的背景,通常会被错误的(父)处理程序捕获.设置本地处理程序可以正常工作,但是
我正在尝试对不可靠的服务器实现请求.该请求很不错,但我的perl脚本成功完成的要求不是100%.问题是服务器偶尔会僵局(我们正在试图找出原因),并且请求永远不会成功.由于服务器认为它是实时的,因此它可以使套接字连接保持打开状态,从而LWP :: Useragent的超时值对我们没有任何好处.在请求上执行绝对超时的最佳方法是什么? fyi,这不是DNS问题.僵局与大量更新有关,同时击中了我们的Postgres数据库.为了测试目的,我们本质上在服务器响应处理程序中放了一段时间(1){}行. 当前,代码看起来像: my $ua = LWP::UserAgent->new; ua->timeout(5); $ua->cookie_jar({}); my $req = HTTP::Request->new(POST => "http://$host:$port/auth/login"); $req->content_type('application/x-www-form-ur
我在我的Django项目中写了一个信号,在内部,我想发送一封电子邮件,其中包含我网站的完整路径.但是,为此,我需要在信号内获取请求对象,我该怎么做?谢谢. @receiver(pre_save, sender=AccessRequest) def email_if_access_true(sender, instance, **kwargs): #How can I get the full path of my website here? pass 解决方案 在您的pre_save信号接收器中放置以下代码: from django.contrib.sites.models import get_current_site current_site = get_current_site(request=None) domain = current_site.domain protocol = "http" 您可以通过将所
我只是在C中学习C中的信号,我想从父母发送信号,但我不明白为什么处理程序在这里不工作... 我的代码: #include #include #include #include void handler(int signumber){ printf("Signal with number %i has arrived\n",signumber); } int main(){ sigset_t sigset; sigemptyset(&sigset); //empty signal set sigaddset(&sigset,SIGTERM); //SIGTERM is in set //sigfillset(&sigset); //each signal is in the set sigprocmask(SIG_BLOCK,&sigset,NULL); /
我正在使用paramiko到tail -f远程服务器上的文件. 以前,我们是通过ssh -t>运行的,但事实证明是片状的,-t引起了我们远程调度系统的问题. 我的问题是脚本捕获Sigint时如何杀死尾巴? 我的脚本(基于 python paramiko模块中的长期运行的ssh命令(以及如何结束它们)) #!/usr/bin/env python2 import paramiko import select client = paramiko.SSHClient() client.load_system_host_keys() client.connect('someserver', username='victorhooi', password='blahblah') transport = client.get_transport() channel = transport.open_session() channel.exec_command("tail