草庐IT

perl-critic

全部标签

linux - perl fork() exec() ,子进程疯狂

我正在使用Linux并且.sh在tcsh中。我做了一个非常基础的fork和exec,但我需要帮助实现安全措施。基本上我的perl脚本在子进程中调用.sh脚本。但是当我用Ctrl+c杀死父进程时,信号被子进程忽略了。1)如何同时为子进程捕获SIGINT?2)运行.sh脚本的子进程仍然STDOUT到xterm的屏幕。我怎样才能删除它?我正在考虑在后台运行脚本exec("shell.shargs&");但还没有测试,因为我需要先弄清楚如何让child不发疯。3)父进程(perl脚本)不等待子进程(.sh脚本)。所以我读了很多关于child变成僵尸的文章???脚本完成后会发生吗?我该如何阻止它

linux - 安装 CPAN 模块而不打乱系统 Perl 安装

我听说最好不要从系统的Perl版本所在的CPAN安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将CPAN与系统的核心Perl分开。我应该:下载源代码并专门为这些模块创建一个目录?有人有任何其他成功使用的想法或实现吗?我正在使用ArchLinux和Perl5.16.2。 最佳答案 你在找类似local::lib的东西吗?local::lib-createandusealocallib/forperlmoduleswithPERL5LIB 关于linux-安装CPAN模块而不

linux - 管道 Perl 脚本输出到 head -n 10 在打印 10 行后杀死脚本

我的Perl脚本输出并记录了多行文本,它进行了一些清理并将一些日志压缩到ENDblock中。问题是当你在命令行上做这样的事情时:perlmyscript.pl|head-n10这会导致脚本在输出10行后立即终止,因此ENDblock不会被执行,日志也不会被压缩。有没有办法解决这个问题并确保我的ENDblock中的代码仍然执行? 最佳答案 当管道的读取端关闭时,写入进程尝试向管道写入内容,然后写入进程收到一个SIGPIPE。pipe被称为坏了。我们可以像这样捕获这个事件local$SIG{PIPE}=sub{#Thisisoureve

linux - 如何检测特定版本的 Perl 中的操作系统名称?

我试图寻找一个关于如何做到这一点的答案,但我似乎找不到。我知道要在perl中查找操作系统名称,您可以使用$^O但是在Linux和Solaris中,无论您使用的是什么操作系统版本,它都只会返回Solaris或Linux。我希望它显示为Solaris10或Solaris11。有没有办法得到这个?你进来我就知道uname-r您可以获得版本号(例如Solaris中的5.10)。关于如何做到这一点有什么想法吗?谢谢=) 最佳答案 perl中的POSIX模块提供了uname调用,所以:usePOSIXqw(uname);my@uname=una

linux - 在 Perl 中将内存大小(人类可读)转换为实际数字(字节)

CPAN中是否有实际的包来转换这样的字符串:my$string="54.4M"my$string2="3.2G"以字节为单位的实际数字:54,400,0003,200,000,000反之亦然。原则上我最后要做的是求和所有内存大小。 最佳答案 要获得您要求的精确输出,请使用Number::FormatEng和Number::Format:usestrict;usewarnings;useNumber::FormatEngqw(:all);useNumber::Formatqw(:subs);my$string="54.4M";my$s

linux - 如何让 Perl 遍历目录中的所有文件?

我有一个包含Perl脚本open(FILE,')){#dostuff}closeFILE;我想在目录中的所有.pp文件上运行这个脚本,所以我用Bash编写了一个包装器脚本#!/bin/bashforfin/etc/puppet/nodes/*.pp;do/etc/puppet/nodes/brackets.pl$fdone问题是否可以避免包装器脚本并让Perl脚本来代替它? 最佳答案 是的。forfin...;转换为Perl对于我的$f(...){...}(在列表的情况下)或while(my$f=...){...}(在迭代器的情况下

linux - 运行 Perl 脚本时在 Text/CSV.pm 上出错

这个问题在这里已经有了答案:What'stheeasiestwaytoinstallamissingPerlmodule?(24个答案)关闭8年前。当运行从Oracle数据库获取内容并将结果导出到CSV的Perl脚本时,我在尝试通过命令行运行时遇到此错误:Can'tlocateText/CSV.pmin@INC(@INCcontains:/usr/lib/perl5/site_perl/5.16.2/x86_64-linux-thread-multi/usr/lib/perl5/site_perl/5.16.2/usr/lib/perl5/vendor_perl/5.16.2/x86_

linux - 如何退出 perl 脚本中的 chroot?

在编写旨在完全自动化虚拟机(Xenpv)设置的perl脚本时,我遇到了一个可能非常简单的小问题。使用perl的chrootfunction我在guest文件系统上做我的事情,然后我需要回到我最初的真实根目录。我到底怎么做到的?脚本示例:`mount$disk_image$mount_point`;chdir($mount_point);chroot($mount_point);#[Domythings...]#`umount$mount_point`;#[Postinstallthings...]我试过exit;,但显然会退出整个脚本。在寻找退出chroot的方法时,我发现了一些旨在退

linux - 我的 perl 脚本如何使用 UDev 而不是 HAL 对任意设备使用react?

我想在每次连接时使用一个简单的Perl脚本进行一些配置,例如我的蓝牙耳机。我尝试使用Net::DBus,但我的OS/DE(Fedora17,GNOME3)不再使用HAL。我真的不想为此安装HAL,那我该怎么办?到目前为止我的想法:(首选):使用DBus;只需监听UDev事件而不是org.freedesktop.Hal。问题:我找不到相应的服务,org.freedesktop.UDisks似乎只能监控磁盘(duh)。UDev是否​​会为其他设备发送DBus消息?如果没有,我可以将其配置为这样做吗?使用UDev规则触发另一个脚本。我喜欢将我的脚本放在一个地方以便轻松过渡到新的操作系统安装,

c++ - Perl 系统调用导致核心转储但 $?保持为零

我有一个Perl脚本(在VirtualBox中的XubuntuLucidLynx上运行),它环绕着几个C/C++二进制文件,将其中一个的输入提供给另一个。其中一行通常包括:my$ret_code=`cat$input|c_binary`;my$ret_val=$?;对于某些输入文件,代码会导致核心转储,但$ret_val和$ret_code分别为0和""。当我运行它时,我可以看到错误滚动,但我似乎无法以编程方式“捕获”它。我该怎么做?目的是在出错时从输入中删除一些行并重试解析。错误如下:***stacksmashingdetected***:code/parserterminated=