奇怪:我可以通过cmd行搜索一个进程;但是通过.pl文件我得到一个错误,
"Can't call method "table" on an undefined value".
代码:
perl -e '
use Proc::ProcessTable;
my $t = new Proc::ProcessTable;
foreach $p (@{$t->table}) {
foreach $f ($t->fields) {
my $result = $p->{fname} cmp "top";
if($result == 0) { print $p->{pid}; }
}
}'
有人可以帮我弄清楚我可能会缺少什么吗?
UPDATED [已添加严格,和警告/警告!]-现在导致此错误:
Global symbol "$p" requires explicit package name at x.services.pl line 9.
Global symbol "$t" requires explicit package name at x.services.pl line 9.
Global symbol "$t" requires explicit package name at x.services.pl line 9.
Global symbol "$p" requires explicit package name at x.services.pl line 9.
Global symbol "$t" requires explicit package name at x.services.pl line 9.
代码:
1 #!/usr/bin/perl
2 use Net::SSH::Perl;
3 use Net::SSH::Expect;
4
5 use strict;
6 use warnings;
7
8 my $remote_host = "severid.company.com";
9 my $serviceInfo = `ssh $remote_host -l myuid -i /home/myuid/.ssh/authorized_keys perl -e 'use Proc::ProcessTable; my $p; my $t; $t = new Proc::ProcessTable; foreach $p (@{$t->table}){print "!"}'`;
10 exit(0);
所以,我正在尝试使用Proc :: ProcessTable将pid#返回到变量中。如果使用这些多个cmd不正确,执行此操作的正确方法是什么?
所以,第一个问题:
您使用的是Net::SSH
模块,但是使用“系统”命令来完成肮脏的工作。一个或另一个是多余的。
将perl内联到ssh会产生插值错误的风险-您如何知道在哪里'
处理?(例如您的shell,ssh,远程shell,perl)。
您要如何处理内联的perl?看起来这是一种非常复杂的操作方式ps -ef | grep top
。
这样做会更明智吗?
foreach ( `/usr/bin/ssh $remote_host -l myuid -i /home/myuid/.ssh/authorized_keys ps -ef` ) {
chomp;
my ( $UID, $PID, $PPID, $C, $STIME, $TTY, $TIME, $CMD ) = split;
if ( $cmd eq "top" ) {
print $PID;
}
}
(或使用Net :: SSH的类似工具);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句