- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要通过 $ssh->system 在后台执行命令,并且有记录表明这应该像本地“系统”命令一样:
'As for "system" builtin, "SIGINT" and "SIGQUIT" signals are blocked. (see "system" in perlfunc).'
实际上,这似乎不是真的,因为当收到 SIGINT 时,子级中的 $ssh->system 会立即终止,即使我明确想先“忽略”它:
use warnings;
use strict;
use POSIX ":sys_wait_h";
use Net::OpenSSH;
my $CTRLC=0;
$SIG{CHLD}='IGNORE';
sub _int_handler {
$CTRLC++;
print "CTRL-C was pressed $CTRLC times!!!\n";
}
$SIG{INT}='IGNORE';
my $SSH=Net::OpenSSH->new('testhost',
forward_agent => 1,
master_stderr_discard => 1,
master_opts => [ -o =>"PasswordAuthentication=no"]);
$SIG{INT}=\&_int_handler;
sub _ssh {
$SIG{INT}='IGNORE';
$SSH->system('sleep 3; sleep 3');
# system('sleep 3; sleep 3');
print "Exiting Child!\n";
exit 0;
}
print "Starting shell ...\n";
_ssh if not (my $PID=fork);
print $PID, "\n";
waitpid ($PID,0);
当运行此代码并在第一个“sleep 3”开始后尝试中断时,“$SSH->system”调用将立即结束。
但是,如果您使用下面的本地“系统”语句,则可以正确捕获 SIGINT。
在 Net::OpenSSH 的源代码中,我发现 $SIG{INT} 也在“system”子目录中显式设置为“IGNORE”。我不知道为什么这不起作用。
我们对任何可能的解决方案表示感谢,即使这意味着以不同的方式做事。最后,我只想远程执行命令并仍然保护它们免受 CTRL-C 的影响。
谢谢,
迷宫
更新:
感谢您的意见@salva。我进一步剥离了东西,最后它似乎是 ssh 的“-S”标志:
$SIG{INT}='IGNORE';
# system('ssh -S /tmp/mysock lnx0001a -- sleep 3');
system('ssh lnx0001a -- sleep 3');
一旦使用“-S/tmp/mysock”变体,ssh 似乎就可以中断,否则就不会。有谁可以对此做出解释吗?我应该为此发布一个新的独立问题吗?
再次感谢,
迷宫
更新2:
我把事情搞得更糟了,现在这完全没有任何 perl 作用域了。您可以在 shell 中执行此操作:
$ trap '' INT
$ ssh lnx0001a -- sleep 3
现在不可中断。然而,就我而言,以下内容仍然是可中断的:
$ ssh -S /tmp/mysock lnx0001a -- sleep 3
使用 CTRL-C,此操作会立即中断。 root 用户的情况与我的情况相同,但其他同事在他们的用户中没有看到这种行为。我们比较了@ENV,但我们没有找出可能导致不同行为的原因。
您感觉如何:在您的 shell 中执行“trap '' INT”后,“-S”版本是否可以中断?(显然,您之前必须为/tmp/mysock 创建主 session )。
真诚的,
迷宫
最佳答案
问题是,当您在控制台上按 CTRL-C 时,内核会向进程组上的所有进程发送信号(请参阅 Prevent control-c from sending SIGINT to all process group children )。
我认为您在行为中看到的差异实际上是由子进程的差异引起的,一些子进程重置了信号标志,而另一些则没有。
无论如何,我将添加对在不同进程组中运行 SSH 进程的支持。添加模块的错误报告RT所以我不要忘记它,拜托。
更新:以下实验显示 OpenSSH system
方法和内置方法的行为方式相同:
my @cmd = $SSH->make_remote_command("sleep 3 && echo hello");
warn "running command @cmd\n";
local $SIG{INT} = 'IGNORE';
system @cmd;
如果您运行它,您将看到信号到达并中止 ssh
进程,即使 INT 信号处理程序设置为 IGNORE
也是如此。
更新2:经过一些实验,我发现问题实际上出在后台运行的主SSH进程上。除非您使用密码身份验证,否则它也会卡在进程组中并因此获取 INT 信号。
我添加了一个新选项来明确要求将主进程作为新进程组运行,但是由于选项数量众多,这部分代码非常复杂,因此这不是一件容易的任务。
更新 3:我发布了新的 development version (0.61_15)模块的。
现在,你可以做...
my $ssh = Net::OpenSSH->new($host, master_setpgrp => 1, ...);
$ssh->system({setpgrp => 1}, "sleep 10; echo uninterruptible");
...希望主或从 SSH 进程不会收到任何 SIGINT。
请报告您可能发现的任何问题!
关于perl - $SIG{INT} ='IGNORE' 无法与 Net::OpenSSH 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790431/
我试图在字符串中显示 sig figs,我找到了 '{:.2f}'.format(x) 样式,只要我有sig figs 在代码中作为整数,但如果 sig figs 的数量包含在变量中,我似乎无法使这种
我创建的脚本有问题。这是我第一次使用信号,因为我希望我的脚本像守护进程一样运行,所以我设置了几个信号处理程序来正确结束我的脚本: local $SIG{HUP} = \&StopSuperviser;
我是 Alloy 新手,由于出现错误,我的程序无法执行或显示。我遇到的错误是 A Syntax error has occurred: You must specify a scope for "th
我在热门编码网站 codechef 上提交名为“Money Transformation”的问题时遇到问题。每次我提交解决方案时,我都会收到运行时错误名称 SIG SEGV。经过一些搜索在谷歌上我发现
Sorbet 显示 attr_reader 错误,但如果我错了请纠正我,当函数被声明而不是被调用时需要 sigs,对吧? 我已经尝试过阅读文档,但我得到的只是这个注释 注意:许多看起来像局部变量的 R
我们有一个关于 XML-sig 的问题,需要有关可选元素以及一些规范化和转换内容的详细信息。我们正在为一个非常小的 XML 语法负载编写规范,它将进入媒体文件的元数据,并且需要通过加密签名。我们认为我
我正在尝试在我的 Perl 程序中添加一个捕获信号。当 ctrl+C 发生时,我想要一条确认消息和一个用户输入( Y 或 N )。 Y 输入工作正常。 如果用户输入 N,那么基本上我想“取消” ctr
这个问题在这里已经有了答案: How does function application with the $ operator curry in Haskell? (1 个回答) 8年前关闭。 如果
这些设置之间有什么区别? $SIG{CHLD} = 'IGNORE' $SIG{CHLD} = 'DEFAULT' $SIG{CHLD} = '' $SIG{CHLD} = undef 根据“U
我有一段 Perl 代码,有点像下面这样(强烈简化): 有一些嵌套的子程序调用(实际上是方法),并且一些内部的执行它们自己的异常处理: sub outer { middle() } sub middl
最近尝试更新 emacs 软件包并得到了这个。 Failed to verify signature archive-contents.sig: No public key for 066DAFCB8
我正在使用带有grails安全性和JA-SIG CAS spring安全性插件的grails。 解决此问题的一种方法是登录到CAS服务器并重新启动应用程序。 另一种方法是,如果我通过同一CAS服务器登
因此,当我尝试传递对象 Map> 时,我的代码显示编译器错误到 Map> 的方法。如下... private static void logProgress(Map>> cacheLoaders, M
我创建了一个信号处理程序,以便在发送 SIGSEGV 时调用。我使用 C 语言编写程序,还使用 Linux 和 intel x86 处理器。在 sig 处理程序中,看起来通过 siginfo_t
我知道,通常你会告诉我检查日志(在崩溃之前,看看我是否遗漏了什么)。 .没什么,因为当我尝试开始一项新 Activity 时,应用程序无论如何都会崩溃。仅有的两个有效 Activity 是 Splas
我对如何正确关闭我正在使用的非常简单的服务器感到困惑。 我在想这应该够了: #!/usr/bin/python import signal import myhandler import Socket
我最近注意到,当使用 utf-8-sig 编码附加到文件时,Python 的行为方式并不明显。见下文: >>> import codecs, os >>> os.path.isfile('123')
我对shell 脚本编写 和Perl 很陌生,我正在尝试将Perl 脚本转换为Python脚本。 我遇到了下面的代码片段,但我并不清楚。 sub sigalrm_handler { printf
我正在构建一个使用蓝牙与远程传感器通信的 iPhone 应用程序。外设是蓝牙自行车速度传感器。该应用程序使用来自外围设备的信息来计算行驶距离。 我看到有一个蓝牙特别兴趣小组 (SIG) 负责确保制造商
我知道 .asc签名作为文本文件输出,而 .sig & .gpg是二进制的。 一边说: 是 .sig和 .gpg同一个文件有不同的扩展名?如果没有,为什么要使用一个? 文本文件和二进制文件,有什么相对
我是一名优秀的程序员,十分优秀!