Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

109
LINES

< > BotCompany Repo | #1019621 // oshi_listProcesses_withoutOpenFiles [dev.]

JavaX fragment (include)

1  
!include once #1034919 // Include OSHI library 6.1.5
2  
3  
import oshi.util.*;
4  
import oshi.software.os.*;
5  
import oshi.software.os.OSProcess;
6  
import oshi.software.os.linux.*;
7  
import oshi.software.os.linux.LinuxOperatingSystem.ProcPidStat;
8  
import oshi.util.platform.linux.ProcUtil;
9  
import oshi.software.os.OperatingSystem.ProcessSort;
10  
11  
static OSProcess[] oshi_listProcesses_withoutOpenFiles(int limit, ProcessSort sort) {
12  
  new L<OSProcess> procs;
13  
  File[] pids = ProcUtil.getPidFiles();
14  
15  
  // now for each file (with digit name) get process info
16  
  for (File pid : pids) {
17  
    OSProcess proc = oshi_getProcess_withoutOpenFiles(ParseUtil.parseIntOrDefault(pid.getName(), 0));
18  
    if (proc != null)
19  
      procs.add(proc);
20  
  }
21  
  List<OSProcess> sorted = processSort(procs, limit, sort);
22  
  return sorted.toArray(new OSProcess[sorted.size()]);
23  
}
24  
25  
static OSProcess oshi_getProcess_withoutOpenFiles(int pid) {
26  
  String path = "";
27  
  Pointer buf = new Memory(1024);
28  
  int size = Libc.INSTANCE.readlink(String.format("/proc/%d/exe", pid), buf, 1023);
29  
  if (size > 0) {
30  
      path = buf.getString(0).substring(0, size);
31  
  }
32  
  Map<String, String> io = FileUtil.getKeyValueMapFromFile(String.format("/proc/%d/io", pid), ":");
33  
  // See man proc for how to parse /proc/[pid]/stat
34  
  long now = System.currentTimeMillis();
35  
  String stat = FileUtil.getStringFromFile(String.format("/proc/%d/stat", pid));
36  
  // A race condition may leave us with an empty string
37  
  if (stat.isEmpty()) null;
38  
  new OSProcess proc;
39  
  // We can get name and status more easily from /proc/pid/status which we
40  
  // call later, so just get the numeric bits here
41  
  proc.setProcessID(pid);
42  
  int[] PROC_PID_STAT_ORDERS = cast get(oshi_operatingSystem(), 'PROC_PID_STAT_ORDERS);
43  
  long[] statArray = ParseUtil.parseStringToLongArray(stat, PROC_PID_STAT_ORDERS, procPidStatLength, ' ');
44  
  proc.setParentProcessID((int) statArray[ProcPidStat.PPID.ordinal()]);
45  
  proc.setThreadCount((int) statArray[ProcPidStat.THREAD_COUNT.ordinal()]);
46  
  proc.setPriority((int) statArray[ProcPidStat.PRIORITY.ordinal()]);
47  
  proc.setVirtualSize(statArray[ProcPidStat.VSZ.ordinal()]);
48  
  proc.setResidentSetSize(statArray[ProcPidStat.RSS.ordinal()] * this.memoryPageSize);
49  
  proc.setKernelTime(statArray[ProcPidStat.KERNEL_TIME.ordinal()] * 1000L / USER_HZ);
50  
  proc.setUserTime(statArray[ProcPidStat.USER_TIME.ordinal()] * 1000L / USER_HZ);
51  
  long BOOT_TIME = cast getOpt(oshi_operatingSystem(), 'BOOT_TIME);
52  
  proc.setStartTime(BOOT_TIME + statArray[ProcPidStat.START_TIME.ordinal()] * 1000L / USER_HZ);
53  
  // BOOT_TIME could be up to 5ms off. In rare cases when a process has
54  
  // started within 5ms of boot it is possible to get negative uptime.
55  
  if (proc.getStartTime() >= now) {
56  
      proc.setStartTime(now - 1);
57  
  }
58  
  proc.setUpTime(now - proc.getStartTime());
59  
  // See man proc for how to parse /proc/[pid]/io
60  
  proc.setBytesRead(ParseUtil.parseLongOrDefault(MapUtil.getOrDefault(io, "read_bytes", ""), 0L));
61  
  proc.setBytesWritten(ParseUtil.parseLongOrDefault(MapUtil.getOrDefault(io, "write_bytes", ""), 0L));
62  
63  
  // gets the open files count
64  
  List<String> openFilesList = ExecutingCommand.runNative(String.format("ls -f /proc/%d/fd", pid));
65  
  proc.setOpenFiles(openFilesList.size() - 1L);
66  
67  
  Map<String, String> status = FileUtil.getKeyValueMapFromFile(String.format("/proc/%d/status", pid), ":");
68  
  proc.setName(MapUtil.getOrDefault(status, "Name", ""));
69  
  proc.setPath(path);
70  
  switch (MapUtil.getOrDefault(status, "State", "U").charAt(0)) {
71  
  case 'R':
72  
      proc.setState(OSProcess.State.RUNNING);
73  
      break;
74  
  case 'S':
75  
      proc.setState(OSProcess.State.SLEEPING);
76  
      break;
77  
  case 'D':
78  
      proc.setState(OSProcess.State.WAITING);
79  
      break;
80  
  case 'Z':
81  
      proc.setState(OSProcess.State.ZOMBIE);
82  
      break;
83  
  case 'T':
84  
      proc.setState(OSProcess.State.STOPPED);
85  
      break;
86  
  default:
87  
      proc.setState(OSProcess.State.OTHER);
88  
      break;
89  
  }
90  
  proc.setUserID(ParseUtil.whitespaces.split(MapUtil.getOrDefault(status, "Uid", ""))[0]);
91  
  proc.setGroupID(ParseUtil.whitespaces.split(MapUtil.getOrDefault(status, "Gid", ""))[0]);
92  
93  
  LinuxUserGroupInfo userGroupInfo = cast get(oshi_operatingSystem(), 'userGroupInfo);
94  
  OSUser user = userGroupInfo.getUser(proc.getUserID());
95  
  if (user != null)
96  
    proc.setUser(user.getUserName());
97  
  proc.setGroup(userGroupInfo.getGroupName(proc.getGroupID()));
98  
99  
  // THe /proc/pid/cmdline value is null-delimited
100  
  proc.setCommandLine(FileUtil.getStringFromFile(String.format("/proc/%d/cmdline", pid)));
101  
  pcall {
102  
      String cwdLink = String.format("/proc/%d/cwd", pid);
103  
      String cwd = new File(cwdLink).getCanonicalPath();
104  
      if (!cwd.equals(cwdLink)) {
105  
          proc.setCurrentWorkingDirectory(cwd);
106  
      }
107  
  }
108  
  ret proc;
109  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 12 computer(s): bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1019621
Snippet name: oshi_listProcesses_withoutOpenFiles [dev.]
Eternal ID of this version: #1019621/15
Text MD5: ea942e3d39d62f7148d44b2ac9495769
Author: stefan
Category: javax / sensors
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-03-15 15:11:46
Source code size: 4840 bytes / 109 lines
Pitched / IR pitched: No / No
Views / Downloads: 270 / 384
Version history: 14 change(s)
Referenced in: [show references]