Class: Unicorn::Worker

Inherits:
Struct
  • Object
show all
Defined in:
lib/unicorn/worker.rb

Overview

This class and its members can be considered a stable interface and will not change in a backwards-incompatible fashion between releases of Unicorn. You may need to access it in the before_fork/after_fork hooks. See the Unicorn::Configurator RDoc for examples.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#nrObject

Returns the value of attribute nr

Returns:

  • (Object)

    the current value of nr



8
9
10
# File 'lib/unicorn/worker.rb', line 8

def nr
  @nr
end

#switchedObject

Returns the value of attribute switched

Returns:

  • (Object)

    the current value of switched



8
9
10
# File 'lib/unicorn/worker.rb', line 8

def switched
  @switched
end

#tmpObject

Returns the value of attribute tmp

Returns:

  • (Object)

    the current value of tmp



8
9
10
# File 'lib/unicorn/worker.rb', line 8

def tmp
  @tmp
end

Instance Method Details

#==(other_nr) ⇒ Object

worker objects may be compared to just plain numbers



11
12
13
# File 'lib/unicorn/worker.rb', line 11

def ==(other_nr)
  self.nr == other_nr
end

#user(user, group = nil) ⇒ Object

Changes the worker process to the specified user and group This is only intended to be called from within the worker process from the after_fork hook. This should be called in the after_fork hook after any priviledged functions need to be run (e.g. to set per-worker CPU affinity, niceness, etc)

Any and all errors raised within this method will be propagated directly back to the caller (usually the after_fork hook. These errors commonly include ArgumentError for specifying an invalid user/group and Errno::EPERM for insufficient priviledges



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/unicorn/worker.rb', line 25

def user(user, group = nil)
  # we do not protect the caller, checking Process.euid == 0 is
  # insufficient because modern systems have fine-grained
  # capabilities.  Let the caller handle any and all errors.
  uid = Etc.getpwnam(user).uid
  gid = Etc.getgrnam(group).gid if group
  Unicorn::Util.chown_logs(uid, gid)
  tmp.chown(uid, gid)
  if gid && Process.egid != gid
    Process.initgroups(user, gid)
    Process::GID.change_privilege(gid)
  end
  Process.euid != uid and Process::UID.change_privilege(uid)
  self.switched = true
end