2014-11-25 51 views
0

请在底部看到我的问题。如何让助手脚本(Bash/Python/Ruby/Perl)执行一个复杂的命令?

这是命令我想在一个Perl脚本已经执行使用system()

zfs send tank/[email protected] | mbuffer -4 -O 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: fatal: no output left - nothing to do 

这是误导,因为我可以在执行命令一个终端,它工作正常。

所以现在我已经变得有创意,找到一种方法来解决这个限制。把命令放在一个文件中,并且做

system("ssh localhost /tmp/test"); 

的工作原理,但是不得不SSH到localhost并且使临时文件不好。需要ssh localhost,否则我会得到相同的错误。

为了避免临时文件创建我试图做一个“解析器文件”

#!/usr/bin/bash 
$1 | $2 

这是呼叫pipe.sh然后在Perl做

my $a = 'zfs send tank/[email protected]'; 
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 
[email protected] 

但这把每个作为一个单独的命令。即zfs,然后send等等。

问题

我已经江郎才尽了如何在不制作一个临时文件,它是坏的执行该命令,如tank/Test0实际上是一个for循环中的变量,所以它会导致许多写道。

而不是调用一个bash脚本我打开执行Ruby或Python脚本,如果他们可以处理这比Bash更好。

更新

如果我从终端做

perl -e'system "bash", "-c", q{zfs send tank/[email protected] | mbuffer -4 -O 10.10.47.47:8023}' 

那么它的工作原理,但是从剧本

system("bash", "-c", q{zfs send tank/[email protected] | mbuffer -4 -O 10.10.47.47:8023}); 

内做同样的给我(与mbuffer冗长5启用)

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/[email protected] | 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 
+0

评论是不适合扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/65630/discussion-on-question-by-jasmine-lognnes-how-to-let-a-helper-script-bash- pytho)。 – 2014-11-25 18:15:26

回答

0

的mbuffer开发人员这样说错误

关于与I/O提示警告 - 警告,这些可以 安全地忽略。 mbuffer只是告诉你,没有任何I/O提示可能是 。 I/O提示仅给操作系统提示什么类型的I/O序列即将到来,以便操作系统能够调整其针对该特定情况的操作 。 I/O提示的大多数实施 不同操作系统...

至于实际的问题,那么Mojo::IOLoop::ForkCall是看到this模块,这不正是我想要做的解决方案。

相关问题