Class BsdOSProcess

java.lang.Object
oshi.software.common.AbstractOSProcess
oshi.software.common.os.unix.bsd.BsdOSProcess
All Implemented Interfaces:
OSProcess
Direct Known Subclasses:
DragonFlyBsdOSProcess, FreeBsdOSProcess, NetBsdOSProcess, OpenBsdOSProcess

@ThreadSafe public abstract class BsdOSProcess extends AbstractOSProcess
Abstract base shared by the BSD-family OSProcess implementations (FreeBSD, OpenBSD, DragonFly, NetBSD). Holds the field storage, the trivial accessors, command-line/argument/environment/bitness memoization, the ps state mapping, the cpuset affinity lookup, and the /proc/<pid>/limits fallback. Platform-specific work (the ps attribute query, thread enumeration, cwd/open-file lookups, and the native argument/environment and file-limit reads) is provided by the per-platform subclasses.
  • Field Details

    • user

      protected String user
    • userID

      protected String userID
    • group

      protected String group
    • groupID

      protected String groupID
    • residentSetSize

      protected long residentSetSize
    • minorFaults

      protected long minorFaults
    • majorFaults

      protected long majorFaults
    • voluntaryContextSwitches

      protected long voluntaryContextSwitches
    • involuntaryContextSwitches

      protected long involuntaryContextSwitches
    • commandLineBackup

      protected String commandLineBackup
  • Constructor Details

    • BsdOSProcess

      protected BsdOSProcess(int pid)
  • Method Details

    • getCommandLine

      public String getCommandLine()
      Description copied from interface: OSProcess
      Gets the process command line used to start the process, including arguments if available to be determined. This method generally returns the same information as OSProcess.getArguments() in a more user-readable format, and is more robust to non-elevated access.

      The format of this string is platform-dependent, may be truncated, and may require the end user to parse the result. Users should generally prefer OSProcess.getArguments() which already parses the results, and use this method as a backup.

      On AIX and Solaris, the string may be truncated to 80 characters if there was insufficient permission to read the process memory.

      On Windows, attempts to retrieve the value from process memory, which requires that the process be owned by the same user as the executing process, or elevated permissions, and additionally requires the target process to have the same bitness (e.g., this will fail on a 32-bit process if queried by 64-bit and vice versa). If reading process memory fails, by default, performs a single WMI query for this process, with some latency. If this method will be frequently called for multiple processes, see the configuration file to enable a batch query mode to improve performance via caching, or configure the option via GlobalConfig before instantiating any OSProcess object.

      Returns:
      the process command line.
    • getArguments

      public List<String> getArguments()
      Description copied from interface: OSProcess
      Makes a best effort attempt to get a list of the the command-line arguments of the process. Returns the same information as OSProcess.getCommandLine() but parsed to a list. May require elevated permissions or same-user ownership.
      Returns:
      A list of Strings representing the arguments. May return an empty list if there was a failure (for example, because the process is already dead or permission was denied).
    • getEnvironmentVariables

      public Map<String,String> getEnvironmentVariables()
      Description copied from interface: OSProcess
      Makes a best effort attempt to obtain the environment variables of the process. May require elevated permissions or same-user ownership.
      Returns:
      A map representing the environment variables and their values. May return an empty map if there was a failure (for example, because the process is already dead or permission was denied).
    • getUser

      public String getUser()
      Description copied from interface: OSProcess
      Gets the user name of the process owner.
      Returns:
      the user name. On Windows systems, also returns the domain prepended to the username.
    • getUserID

      public String getUserID()
      Description copied from interface: OSProcess
      Gets the user id of the process owner.
      Returns:
      the userID. On Windows systems, returns the Security ID (SID)
    • getGroup

      public String getGroup()
      Description copied from interface: OSProcess
      Gets the group under which the process is executing.

      On Windows systems, populating this value for processes other than the current user requires administrative privileges (and still may fail for some system processes) and can incur significant latency. When successful, returns a the default primary group with access to this process, corresponding to the SID in OSProcess.getGroupID().

      Returns:
      the group.
    • getGroupID

      public String getGroupID()
      Description copied from interface: OSProcess
      Gets the group id under which the process is executing.

      On Windows systems, populating this value for processes other than the current user requires administrative privileges (and still may fail for some system processes) and can incur significant latency. When successful, returns the default primary group SID with access to this process, corresponding to the name in OSProcess.getGroup().

      Returns:
      the groupID.
    • getResidentMemory

      public long getResidentMemory()
      Description copied from interface: OSProcess
      Returns the total amount of physical memory (RAM) currently mapped to the process's address space. This value represents the Resident Set Size (RSS) and includes both private memory and memory shared with other processes (such as shared libraries). This aligns with the reporting behavior of standard command-line utilities like ps and top.

      On Linux, returns the RSS value from /proc/[pid]/stat, which may be inaccurate because of a kernel-internal scalability optimization. If accurate values are required, read /proc/[pid]/smaps using FileUtil#getKeyValueMapFromFile(String, String).

      Returns:
      The resident set size in bytes.
    • getMinorFaults

      public long getMinorFaults()
      Description copied from interface: OSProcess
      Gets the number of minor (soft) faults the process has made which have not required loading a memory page from disk. Sometimes called reclaims.

      On Windows, this includes the total of major and minor faults.

      Not available on AIX.

      Returns:
      minor page faults (reclaims).
    • getMajorFaults

      public long getMajorFaults()
      Description copied from interface: OSProcess
      Gets the number of major (hard) faults the process has made which have required loading a memory page from disk.

      Windows does not distinguish major and minor faults at the process level, so this value returns 0 and major faults are included in OSProcess.getMinorFaults().

      Not available on AIX.

      Returns:
      major page faults.
    • getVoluntaryContextSwitches

      public long getVoluntaryContextSwitches()
      Description copied from interface: OSProcess
      The number of voluntary context switches the process has made. A voluntary context switch occurs when a process gives up the CPU before its time slice expires (e.g., waiting for I/O).

      For the current process, getrusage(RUSAGE_SELF) is used on supported POSIX platforms, which aggregates across all threads. For other processes, platform-specific sources are used (/proc/[pid]/status on Linux, ps on FreeBSD/OpenBSD, /proc/[pid]/usage on Solaris). On macOS, the split is only available for the current process; for other processes this returns 0.

      Returns:
      voluntary context switches if available, 0 otherwise.
    • getInvoluntaryContextSwitches

      public long getInvoluntaryContextSwitches()
      Description copied from interface: OSProcess
      The number of involuntary context switches the process has made. An involuntary context switch occurs when the scheduler preempts the process (e.g., time slice expired).

      For the current process, getrusage(RUSAGE_SELF) is used on supported POSIX platforms, which aggregates across all threads. For other processes, platform-specific sources are used (/proc/[pid]/status on Linux, ps on FreeBSD/OpenBSD, /proc/[pid]/usage on Solaris). On macOS, the split is only available for the current process; for other processes this returns 0.

      Returns:
      involuntary context switches if available, 0 otherwise.
    • getBitness

      public int getBitness()
      Description copied from interface: OSProcess
      Attempts to get the bitness (32 or 64) of the process.
      Returns:
      The bitness, if able to be determined, 0 otherwise.
    • getAffinityMask

      public long getAffinityMask()
      Description copied from interface: OSProcess
      Gets the process affinity mask for this process.

      On Windows systems with more than 64 processors, if the threads of the calling process are in a single processor group, returns the process affinity mask for that group (which may be zero if the specified process is running in a different group). If the calling process contains threads in multiple groups, returns zero.

      Because macOS does not export interfaces that identify processors or control thread placement, explicit thread to processor binding is not supported and this method will return a bitmask of all logical processors.

      If the Operating System fails to retrieve an affinity mask (e.g., the process has terminated), returns zero.

      Returns:
      a bit vector in which each bit represents the processors that a process is allowed to run on.
    • updateAttributes

      public boolean updateAttributes()
      Description copied from interface: OSProcess
      Attempts to update process attributes. Returns false if the update fails, which will occur if the process no longer exists.
      Returns:
      true if the update was successful, false if the update failed. In addition, on a failed update the process state will be changed to OSProcess.State.INVALID.
    • updateAttributes

      protected boolean updateAttributes(Map<BsdPsKeyword, String> psMap)
      Populates this process's attributes from a parsed ps row. Shared by every BSD platform; differences in the available columns are handled by checking which keys are present in the map.
      Parameters:
      psMap - the parsed ps columns for this process
      Returns:
      true once the attributes are populated
    • getStateFromOutput

      protected static OSProcess.State getStateFromOutput(char stateValue)
      Maps a ps single-character state to an OSProcess.State.
      Parameters:
      stateValue - the first character of the ps STATE column
      Returns:
      the corresponding process state
    • getProcessOpenFileLimit

      protected static long getProcessOpenFileLimit(long processId, int index)
      Parses the soft or hard open-file limit for another process from /proc/<pid>/limits.
      Parameters:
      processId - the process ID
      index - 1 for the soft limit, 2 for the hard limit
      Returns:
      the limit, or -1 if unavailable
    • psKeywords

      protected abstract List<BsdPsKeyword> psKeywords()
      Returns this platform's ordered ps column keys, used both to build the ps command and to parse its output positionally.
      Returns:
      the ordered column keys
    • psCommandArgs

      protected abstract String psCommandArgs()
      Returns the comma-separated ps -o column list for this platform, derived from psKeywords().
      Returns:
      the ps column argument
    • queryStartTimeMillis

      protected long queryStartTimeMillis()
      Returns this process's start time in epoch milliseconds, or -1 to derive it from the ps elapsed-time column. The default derives from elapsed time; platforms with an absolute source (DragonFly's /proc) override this.
      Returns:
      the start time in epoch milliseconds, or -1 to derive from elapsed time
    • updateThreadCount

      protected void updateThreadCount()
      Populates AbstractOSProcess.threadCount for platforms whose ps output lacks an nlwp column. The default is a no-op (the count is taken from the nlwp column); OpenBSD and NetBSD override this with a separate ps query.
    • queryArguments

      protected abstract List<String> queryArguments()
      Queries this process's argument list.
      Returns:
      the arguments, or an empty list if unavailable
    • queryEnvironmentVariables

      protected abstract Map<String,String> queryEnvironmentVariables()
      Queries this process's environment variables.
      Returns:
      the environment map, or an empty map if unavailable
    • queryBitness

      protected abstract int queryBitness()
      Queries this process's bitness (32 or 64), or 0 if unknown.
      Returns:
      the bitness