#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Process Utilities"

config FREE
	bool "free"
	default n
	help
	  free displays the total amount of free and used physical and swap
	  memory in the system, as well as the buffers used by the kernel.
	  The shared memory column should be ignored; it is obsolete.

config FUSER
	bool "fuser"
	default n
	help
	  fuser lists all PIDs (Process IDs) that currently have a given
	  file open. fuser can also list all PIDs that have a given network
	  (TCP or UDP) port open.

config KILL
	bool "kill"
	default n
	help
	  The command kill sends the specified signal to the specified
	  process or process group. If no signal is specified, the TERM
	  signal is sent.

config KILLALL
	bool "killall"
	default n
	depends on KILL
	help
	  killall sends a signal to all processes running any of the
	  specified commands. If no signal name is specified, SIGTERM is
	  sent.

config KILLALL5
	bool "killall5"
	default n
	depends on KILL

config NMETER
	bool "nmeter"
	default n
	help
	  Prints selected system stats continuously, one line per update.

config PGREP
	bool "pgrep"
	default n
	help
	  Look for processes by name.

config PIDOF
	bool "pidof"
	default n
	help
	  Pidof finds the process id's (pids) of the named programs. It prints
	  those id's on the standard output.

config FEATURE_PIDOF_SINGLE
	bool "Enable argument for single shot (-s)"
	default n
	depends on PIDOF
	help
	  Support argument '-s' for returning only the first pid found.

config FEATURE_PIDOF_OMIT
	bool "Enable argument for omitting pids (-o)"
	default n
	depends on PIDOF
	help
	  Support argument '-o' for omitting the given pids in output.
	  The special pid %PPID can be used to name the parent process
	  of the pidof, in other words the calling shell or shell script.

config PKILL
	bool "pkill"
	default n
	help
	  Send signals to processes by name.

config PS
	bool "ps"
	default n
	help
	  ps gives a snapshot of the current processes.

config FEATURE_PS_WIDE
	bool "Enable wide output option (-w)"
	default n
	depends on PS
	help
	  Support argument 'w' for wide output.
	  If given once, 132 chars are printed, and if given more
	  than once, the length is unlimited.

config FEATURE_PS_TIME
	bool "Enable time and elapsed time output"
	default n
	depends on PS && DESKTOP
	help
	  Support -o time and -o etime output specifiers.

config FEATURE_PS_ADDITIONAL_COLUMNS
	bool "Enable additional ps columns"
	default n
	depends on PS && DESKTOP
	help
	  Support -o rgroup, -o ruser, -o nice output specifiers.

config FEATURE_PS_UNUSUAL_SYSTEMS
	bool "Support Linux prior to 2.4.0 and non-ELF systems"
	default n
	depends on FEATURE_PS_TIME
	help
	  Include support for measuring HZ on old kernels and non-ELF systems
	  (if you are on Linux 2.4.0+ and use ELF, you don't need this)

config RENICE
	bool "renice"
	default n
	help
	  Renice alters the scheduling priority of one or more running
	  processes.

config BB_SYSCTL
	bool "sysctl"
	default n
	help
	  Configure kernel parameters at runtime.

config TOP
	bool "top"
	default n
	help
	  The top program provides a dynamic real-time view of a running
	  system.

config FEATURE_TOP_CPU_USAGE_PERCENTAGE
	bool "Show CPU per-process usage percentage"
	default y
	depends on TOP
	help
	  Make top display CPU usage for each process.
	  This adds about 2k.

config FEATURE_TOP_CPU_GLOBAL_PERCENTS
	bool "Show CPU global usage percentage"
	default y
	depends on FEATURE_TOP_CPU_USAGE_PERCENTAGE
	help
	  Makes top display "CPU: NN% usr NN% sys..." line.
	  This adds about 0.5k.

config FEATURE_TOP_SMP_CPU
	bool "SMP CPU usage display ('c' key)"
	default n
	depends on FEATURE_TOP_CPU_GLOBAL_PERCENTS
	help
	  Allow 'c' key to switch between individual/cumulative CPU stats
	  This adds about 0.5k.

config FEATURE_TOP_DECIMALS
	bool "Show 1/10th of a percent in CPU/mem statistics"
	default n
	depends on FEATURE_TOP_CPU_USAGE_PERCENTAGE
	help
	  Show 1/10th of a percent in CPU/mem statistics.
	  This adds about 0.3k.

config FEATURE_TOP_SMP_PROCESS
	bool "Show CPU process runs on ('j' field)"
	default n
	depends on TOP
	help
	  Show CPU where process was last found running on.
	  This is the 'j' field.

config FEATURE_TOPMEM
	bool "Topmem command ('s' key)"
	default n
	depends on TOP
	help
	  Enable 's' in top (gives lots of memory info).

config UPTIME
	bool "uptime"
	default n
	help
	  uptime gives a one line display of the current time, how long
	  the system has been running, how many users are currently logged
	  on, and the system load averages for the past 1, 5, and 15 minutes.

config WATCH
	bool "watch"
	default n
	help
	  watch is used to execute a program periodically, showing
	  output to the screen.


endmenu
