小编awo*_*ojo的帖子

获取当前子shell的pid

我试图获取当前正在执行的子shell的pid - 但$$只返回父pid:

#!/usr/bin/sh

x() {
  echo "I am a subshell x echo 1 and my pid is $$"
}

y() {
  echo "I am a subshell y echo 1 and my pid is $$"
}


echo "I am the parent shell and my pid is $$"
x &
echo "Just launched x and the pid is $! "

y &
echo "Just launched y and the pid is $! "

wait
Run Code Online (Sandbox Code Playgroud)

产量

I am the parent shell …
Run Code Online (Sandbox Code Playgroud)

bash sh

26
推荐指数
2
解决办法
1万
查看次数

从ruby中的文件内容循环

好的,所以我是Ruby的新手,我在bash/ksh/sh中有很强的背景知识.

我想要做的是使用一个简单的for循环来跨多个服务器运行命令.在bash我会这样做:

for SERVER in `cat etc/SERVER_LIST`
do
    ssh -q ${SERVER} "ls -l /etc"
done
Run Code Online (Sandbox Code Playgroud)

etc/SERVER_LIST只是一个看起来像这样的文件:

server1
server2
server3
etc
Run Code Online (Sandbox Code Playgroud)

我似乎无法在Ruby中做到这一点.这是我到目前为止:

 #!/usr/bin/ruby
### SSH testing
#
#

require 'net/ssh'

File.open("etc/SERVER_LIST") do |f|
        f.each_line do |line|
                Net::SSH.start(line, 'andex') do |ssh|
                        result = ssh.exec!("ls -l")
                        puts result
                end
        end
end
Run Code Online (Sandbox Code Playgroud)

我现在收到这些错误:

andex@master:~/sysauto> ./ssh2.rb
/usr/lib64/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:65:in `initialize': newline at the end of hostname (SocketError)
        from /usr/lib64/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:65:in `open'
        from /usr/lib64/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:65:in `initialize'
        from /usr/lib64/ruby/1.8/timeout.rb:53:in `timeout'
        from /usr/lib64/ruby/1.8/timeout.rb:93:in `timeout'
        from /usr/lib64/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:65:in `initialize'
        from /usr/lib64/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh.rb:179:in `new'
        from /usr/lib64/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh.rb:179:in …
Run Code Online (Sandbox Code Playgroud)

ruby

9
推荐指数
3
解决办法
2万
查看次数

等待Ruby子pid退出

我正在尝试分叉一个子进程,等待它完成,如果它在一定时间内没有完成,就把它杀掉.

这是我到目前为止:

servers.each do |server|
    pid = fork do
        puts "Forking #{server}."
        output = "doing stuff here"
        puts output
    end

    Process.wait
    puts "#{server} child exited, pid = #{pid}"
end
Run Code Online (Sandbox Code Playgroud)

在Process.wait之后的某个地方,我希望某种实用程序等待20秒,如果进程仍然在那里,我想杀死它并将输出标记为"ERROR".

我是fork/exec的新手.我的代码实际上是分叉的,但我只是不知道如何处理它的等待/查杀方面.

ruby fork

7
推荐指数
1
解决办法
9844
查看次数

Ruby多线程问题

我开始研究Ruby中的多线程.

所以基本上,我想创建一些线程,让它们全部执行,但是在线程成功完成之前不显示任何输出.

例:

#!/usr/bin/env ruby

t1 = Thread.new {
puts "Hello_1"
sleep(5)
puts "Hello_1 after 5 seconds of  sleep"
}

t2 = Thread.new {
puts "Hello_2"
sleep(5)
puts "Hello_2 after 5 seconds of  sleep"
}

t1.join
t2.join

puts "Hello_3"
sleep(5)
puts "Hello_3 after 5 seconds of  sleep"
Run Code Online (Sandbox Code Playgroud)

第一个Hello_1/Hello_2立即执行.在线程成功完成之前,我不希望显示任何输出.

ruby multithreading

3
推荐指数
1
解决办法
1888
查看次数

如何在 Ruby 中使用全局变量

我有一种情况,我在脚本顶部定义了一个变量,并希望在方法中引用它:

#############
# Variables #
#############
tmp_dir = '/path/to/tmp/dir'

###########
# Methods #
###########
def cache(page)
  begin
    %x[wget -q -O #{tmp_dir}/page #{page}]
  rescue => msg
    puts "error: #{msg}"
    exit
  end
 end

cache("http://somepage.com")
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

undefined local variable or method `tmp_dir' for main:Object
Run Code Online (Sandbox Code Playgroud)

我猜我需要创建tmp_dir一个全局变量?我讨厌使用全局变量。有没有 Ruby-ish 的方法来做到这一点?

ruby

3
推荐指数
1
解决办法
2572
查看次数

通过Ruby系统调用通过SSH发送美元符号

我正在尝试通过SSH系统调用服务器并回显字符串.该字符串由ruby定义,并在其中有美元符号.

#!/usr/bin/env ruby
string = '$$%%$#@%$#@%325dg345345'

puts %x(ssh server "echo \'#{string}\'")
Run Code Online (Sandbox Code Playgroud)

当我执行时,返回的输出不是字符串.远程服务器将美元符号解释为变量.有什么形式的聪明逃避我可以做以防止这种情况?字符是随机的,所以只需编辑字符串以逃避美元符号将无效.

ruby ssh

2
推荐指数
1
解决办法
1416
查看次数

将数据从YAML加载到数组中

我有这样的数据集:

5.3.12.0
5.3.12.1
5.3.12.2
5.3.12.3 
5.3.12.4
Run Code Online (Sandbox Code Playgroud)

如何在YAML文件中构建它,然后将其作为简单数组加载到Ruby中?

我希望上面的数据作为数组加载,如:

fileset_levels = ["5.3.12.0", "5.3.12.1", "5.3.12.2", "5.3.12.3", "5.3.12.4"]
Run Code Online (Sandbox Code Playgroud)

我将要加载多个这些数组,所以我想要调用文件:

vuln1.yml
vuln2.yml
Run Code Online (Sandbox Code Playgroud)

并将它们全部加载为我可以在我的Ruby脚本中使用的数组.

我试过了:

vuln1_array = yaml::load("vuln1.yml")
Run Code Online (Sandbox Code Playgroud)

但它不会创建数组.

ruby yaml

0
推荐指数
1
解决办法
1718
查看次数

标签 统计

ruby ×6

bash ×1

fork ×1

multithreading ×1

sh ×1

ssh ×1

yaml ×1