请看下面我的问题。在
这是我希望在Perl脚本中使用system()
执行的命令
zfs send tank/Test0@snap | mbuffer -4 -O 10.10.47.47:8023
但我得到了这个错误
^{pr2}$这是误导,因为我可以在终端中执行命令,而且它工作得很好。在
所以现在我变得很有创造力,想办法解决这个局限性。把命令放到一个文件中
system("ssh localhost /tmp/test");
可以,但是必须SSH到本地主机并生成临时文件并不好。需要ssh localhost
,否则我会得到相同的错误。在
为了避免创建临时文件,我尝试创建一个“解析器文件”
#!/usr/bin/bash
$1 | $2
调用pipe.sh
,然后在Perl中执行do
my $a = 'zfs send tank/Test0@snap';
my $b = "mbuffer -4 -O 10.10.47.47:8023";
system("pipe.sh $a $b");
但是pipe.sh
执行zfs | send
。在
我的下一个想法是
my $c = "zfs send tank/Test0\@snap \| mbuffer -4 -O 10.10.47.47:8023";
system("pipe.sh $c");
用pipe.sh
变成
#!/usr/bin/bash
$@
但这将把它们视为一个单独的命令。一、 例如zfs
,然后send
等等。在
问题
我已经没有办法在不生成临时文件的情况下执行该命令,这很糟糕,因为tank/Test0
实际上是for循环中的一个变量,因此它会导致许多写操作。在
我不想调用bash脚本,而是愿意执行Ruby或Python脚本,如果它们能比bash处理得更好的话。在
更新
如果我从候机楼来的话
perl -e'system "bash", "-c", q{zfs send tank/Test0@snap | mbuffer -4 -O 10.10.47.47:8023}'
然后它就可以工作了,但是在脚本中执行同样的操作
system("bash", "-c", q{zfs send tank/Test0@snap | mbuffer -4 -O 10.10.47.47:8023});
给我5个详细的FFER
mbuffer: Verbose = 5
mbuffer: total # of phys pages: 1132576 (pagesize 4096)
mbuffer: default buffer set to 22651 blocks of 4096 bytes
mbuffer: getting address info for 10.10.47.47:8023
mbuffer: warning: error connecting to 10.10.47.47:8023: Connection refused
mbuffer: error: unable to connect to 10.10.47.47:8023
mbuffer: allocating memory for 22651 blocks with 4096 byte (90604 kB total)...
mbuffer: creating semaphores...
mbuffer: opening input...
mbuffer: direct I/O hinting failed for input: Invalid argument
mbuffer: fatal: no output left - nothing to do
更新2
这真的很管用!在
system("ssh", "localhost", q{zfs send tank/Test0@snap | mbuffer -4 -v 5 -O 10.10.47.47:8023});
在启用了最详细的情况下,我得到了以下错误,但由于某些原因起作用。在
mbuffer: Verbose = 5
mbuffer: total # of phys pages: 1130435 (pagesize 4096)
mbuffer: default buffer set to 22608 blocks of 4096 bytes
mbuffer: getting address info for 10.10.47.47:8023
mbuffer: successfully connected to 10.10.47.47:8023
mbuffer: set TCP send buffer size to 1048576
mbuffer: allocating memory for 22608 blocks with 4096 byte (90432 kB total)...
mbuffer: creating semaphores...
mbuffer: opening input...
mbuffer: direct I/O hinting failed for input: Invalid argument
mbuffer: direct I/O hinting failed for output to 10.10.47.47:8023: Invalid argument
mbuffer: checking if we have a controlling terminal...
mbuffer: registering signals...
mbuffer: starting threads...
mbuffer: checking output device...
mbuffer: no device on output stream
mbuffer: checking input device...
mbuffer: no device on input stream
mbuffer: outputThread: starting output on 10.10.47.47:8023...
mbuffer: inputThread: starting with threadid 3...
mbuffer: inputThread: last block has 2640 bytes
mbuffer: inputThread: exiting...
mbuffer: outputThread: last block has 2640 bytes
mbuffer: outputThread: syncing 10.10.47.47:8023...
mbuffer: syncing unsupported on 10.10.47.47:8023: omitted.
mbuffer: outputThread: finished - exiting...
mbuffer: waiting for senders...
mbuffer: joining sender for 10.10.47.47:8023
summary: 46.0 KiByte in 0.0 sec - average of 22.9 MiB/s
mbuffer开发人员对错误有这样的看法
至于实际的问题,那么
Mojo::IOLoop::ForkCall
是this模块中看到的解决方案,它正是我要做的。在相关问题 更多 >
编程相关推荐