我试图获取当前正在执行的子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) 好的,所以我是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) 我正在尝试分叉一个子进程,等待它完成,如果它在一定时间内没有完成,就把它杀掉.
这是我到目前为止:
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中的多线程.
所以基本上,我想创建一些线程,让它们全部执行,但是在线程成功完成之前不显示任何输出.
例:
#!/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立即执行.在线程成功完成之前,我不希望显示任何输出.
我有一种情况,我在脚本顶部定义了一个变量,并希望在方法中引用它:
#############
# 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 的方法来做到这一点?
我正在尝试通过SSH系统调用服务器并回显字符串.该字符串由ruby定义,并在其中有美元符号.
#!/usr/bin/env ruby
string = '$$%%$#@%$#@%325dg345345'
puts %x(ssh server "echo \'#{string}\'")
Run Code Online (Sandbox Code Playgroud)
当我执行时,返回的输出不是字符串.远程服务器将美元符号解释为变量.有什么形式的聪明逃避我可以做以防止这种情况?字符是随机的,所以只需编辑字符串以逃避美元符号将无效.
我有这样的数据集:
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)
但它不会创建数组.