📄 09 - killing all processes for a given user.rb
字号:
#!/usr/bin/ruby -w# banish.rbdef signal_all(username, signal) lookup_uid(username) killed = 0 %x{ps -U #{username}}.each_with_index do |proc, i| next if i == 0 # Skip the header provided by ps pid = proc.split[0].to_i begin Process.kill(signal, pid) rescue SystemCallError => e raise e unless e.errno == Errno::ESRCH end killed += 1 end return killedend#---def lookup_uid(username) require 'etc' begin user = Etc.getpwnam(username) rescue ArgumentError raise ArgumentError, "No such user: #{username}" end return user.uidend#---require 'optparse'signal = "SIGTERM"opts = OptionParser.new do |opts| opts.banner = "Usage: #{__FILE__} [-9] [USERNAME]" opts.on("-9", "--with-extreme-prejudice", "Send an uncatchable kill signal.") { signal = "SIGKILL" }endopts.parse!(ARGV)if ARGV.size != 1 $stderr.puts opts.banner exitendusername = ARGV[0]if username == 'root' $stderr.puts "Sorry, killing all of root's processes " + "would bring down the system." exitendputs "Killed #{signal_all(username, signal)} process(es)."#---$ ./banish.rb peon5 process(es) killed#---def signal_all(username, signal) uid = lookup_uid(username) require 'sys/proctable' killed = 0 Sys::ProcTable.ps.each do |proc| if proc.uid == uid begin Process.kill(signal, proc.pid) rescue SystemCallError => e raise e unless e.errno == Errno::ESRCH end killed += 1 end end return killedend#---
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -