2

如果远程计算机没有被积极使用,我想编写一个将 ssh 放入远程盒子并在那里运行作业的程序。我将以 clusterJobRunner@remoteBox 身份登录,而另一个用户将以 someLocalUser@remoteBox 身份登录。

有没有办法查看远程用户是否正在使用 Python 或 Java 主动使用该框?

4

5 回答 5

2

如果目的是避免打扰 someLocalUser,您可以考虑以较低的优先级运行您的作业。请参阅文档以获取nice

于 2012-07-16T18:44:03.220 回答
1

在 Java 中,您可以使用 执行usersLinux 命令Runtime.exec(),获取标准输出并将其转换为可解析的String. 我认为没有任何独立于操作系统的方法可以做到这一点。

于 2012-07-16T18:15:03.130 回答
1

我认为“积极使用”的部分是棘手的部分。

如果检查其他用户是否登录就足够了,您可以使用命令wandwho或者lastand lastlog。所有这些命令都有几个参数,您可以在手册中查找。

在 Java / Python 中,您可以执行这些命令并解析它们的输出。

另一方面:工具wwho使用文件utmp来获取他们的信息。一个快速的谷歌没有为 Java 找到任何东西,但对于 Python,我找到了库pyutmp,您可以使用它utmp直接读取文件而无需解析命令输出。

用户是否登录并去吃午饭(可能锁定屏幕)完全是另一回事。

于 2012-07-16T18:37:03.390 回答
0

我支持@Eero Aaltonen 的答案——你应该在nice. 一台 Linux 计算机可以在 100% CPU 繁忙的情况下运行,但如果额外的任务全部完成,用户会感觉良好且快速nice;调度程序只会nice在主用户的任务空闲时运行任务。

但是,如果您想弄清楚机器是否正在使用,我建议您查看w命令。按照您的提示尝试man w。该w命令打印机器的平均负载、用户列表以及他们使用了多少时间(包括他们正在运行的任何后台任务的组合时间,加上他们的主要任务的时间)。

于 2012-07-16T19:49:42.960 回答
0

您需要定义“积极使用”对您意味着什么。以下哪项定义了“积极使用”:

  1. 用户已登录
  2. 用户正在积极地与盒子互动,在他们的 ssh 会话中输入内容。
  3. 用户正在运行作业

如果 #2 是您要查找的内容,并且用户仅使用 ssh 登录,您可能会挂接到 sshd 守护程序并监视它是否正在接收来自 ssh 客户端的输入。

例如,如果您将 strace 附加到已登录用户的 sshd,您可以监视来自 ssh 客户端的读取。这是一个对我有用的例子:

$ for x in $(ps aux | grep sshd | grep "@pts" | sed -E 's/[^ ]+ +([0-9]*).*/\1/'); do {(sudo strace -p $x -eread 2>&1 | grep 'read(4' )&}; done
[1] 166396
[2] 166397
[3] 166399
[4] 166402
read(4, "\206\261\364\271\204\\\26S\3\"El\365W\352\35\375\242\205Qlu@$\2538\306\2777oW\230"..., 16384) = 36
read(4, "@s\2733d\355\17~\2550=\316`)3|^\340\f\252\242_\251\377d[l\221\210|z\37"..., 16384) = 36
read(4, "\5\214\261\25\322\222\242\221\313\314\4$\344\273\200\220a\233\345*\7\17\274\331\246\363f.\346\365\22\255"..., 16384) = 36
read(4, "\325\220<\0:\34^\235\346y\223\304\3061\212\203\373\371rD Rs\254oL*\260\22\234\372\27"..., 16384) = 36
read(4, "TXD\7\373~.\214\321\35\201\350\22\211\34J~m\\\270\364\243\267\261\207\323\224\314x\240i'"..., 16384) = 36
read(4, "\347\320\243\v/Z\213n\7\264\376\27\0340\30\364u!9\n\326\314)c\331\362\346\256\317E8\317"..., 16384) = 36
read(4, "\7\264\207\232\252xT\271\240Aq\210\21m\232l\306i\225\311\356\3

您在这里看到的是对使用 ssh 登录的每个用户的所有 sshd 分叉进程的文件描述符 4 上的读取调用。文件描述符 4 似乎是分配给连接到客户端 (YMMV) 的套接字的描述符。每行输出意味着一个用户(或脚本)正在从客户端向服务器发送一些东西,这似乎对应于用户在 shell 中输入一些东西。

您也许可以在此基础上再接再厉。

于 2021-02-25T08:29:32.413 回答