基于队列的shell在Linux?

我想根据服务器负载来控制用户程序的执行。 每个用户使用bash。 有没有办法做一个types的队列,从命令行执行命令将被挂起,直到资源可用?

谢谢阿尔曼

阿尔曼,你提出的范例是大型机的刚性时间共享模型。 在大型机中,一个进程将主宰机器,直到它完成或被暂停。 随着时间的推移,人们厌倦了失控的工作,核心开始更频繁地停顿,暂停进程,以便其他进程可以转向。 这个function被称为调度程序。 和我一起工作一分钟。

大量的工作进入调度程序,使每个使用系统的人都感觉系统在那里进行投标,即使一次只有一个进程在一次转换。 现在使用多个CPU和更高版本的内核,电脑确实可以一次完成多件事情。 在多核系统上,电脑“忙”的概念有点模糊。 在Linux中,为进程分配一个CPU,并在暂停和恢复时拥有一个CPU,尽pipe调度程序保留将进程移动到另一个核心的权利。

所以,你真正的需求可以expression在这种情况下。 三个人被授予访问您的新系统:米歇尔,尼克和奥维尔。 所有这三个人都希望看到电脑在着名的光线追踪器POV-Ray中渲染复杂帧的速度有多快。 米歇尔是你的首席开发人员,老板说她可以用任何她想要的方式使用机器。 尼克是你的初级开发人员之一,老板说,只要他不干涉米歇尔偶尔的框架渲染,他就可以工作。 尼克对机器更加兴奋,并且有各种各样的乐趣排队。 奥维尔在graphics部门工作,老板只希望他看到图片和场景文件,但他不希望奥维尔干涉任何渲染。 为了保持整洁有序,我们将有三个用户组:员工,新手和局外人。 我不build议使用这些名称,除非您想添加到最后一个组。 从/etc/group摘录可能会读取:

  staff:1001::michelle,theboss newbie:1002::nick,alode,ian outsider:1003::orville raytracers:1004::staff,newbie 

我们将采用双pipe齐下的方法来解决这个问题。 第一个prong将是限制,第二个将是简单的文件权限( chmodchgrp )。

首先,我们会搞砸限制。 可插拔authentication模块(PAM)通过其pam_limits模块强制执行这些模块。 我们将确保它在下面正确configuration。 查看limits.conf的手册页,了解有关您可以执行limits.conf限制的详细信息。 两个术语在这里很重要:软限制和硬限制。 软限制应始终小于硬限制。 硬限制是一旦设置就不能改变的上限。 如果用户想要警告他们即将被挤压,并且如果允许用户使用ulimit命令改变它,那么也用作默认设置。 关于ulimit的细节可能在你的shell的man page中(例如man bash )。 我们对硬性限制感兴趣,因为我们会用它来执行肮脏工作的执行者。 尝试ulimit一段时间,直到你理解的影响,看到这些数字是你理解的东西。

现在来了棘手的部分。 诡because,因为如果你弄错了,米歇尔或尼克会来抱怨你或你的老板。 米歇尔可能会抱怨说尼克在干扰,尼克可能会抱怨说他不能在新系统上得到任何时间。 注意,这不是一个技术问题,而是解释老板的愿望并将其转化为系统configuration的最佳猜测。 关于什么限制的沟通可能会限制你的痛苦。

所以让我们以一种不会让南希心烦的方式来设定尼克和奥维尔的限制。 我们将详细介绍newbie组的设置。

  1. 最大调度优先级设置为15. 20是默认值,是最低优先级。
  2. 最大内存消耗量限制为1 GB。 鉴于这是光线追踪,这限制了场景的复杂性。

一个重要的注意事项是,我们打算将所有员工作业的默认优先级设置为15,最多为10.是的,在这种情况下,15小于10,因为20是最低优先级,0是非最高优先级,根用户。 如果你站在你的头上,就很容易把握。

我需要提及的是,我正在使用和Ubuntu的盒子,你的里程可能会有所不同,如何分配有PAM设置,具体来说, pam_limits 。 我在我的系统上有这个行, session required pam_limits.so在这些文件中session required pam_limits.so

  • /etc/pam.d/login
  • /etc/pam.d/sshd
  • /etc/pam.d/cron
  • /etc/pam.d/at
  • /etc/pam.d/su
  • /etc/pam.d/sudo
  • /etc/pam.d/gdm
  • /etc/pam.d/gdm-autologin

然后,让我们把我们的限制放到/etc/limits.conf或者/etc/limits.conf单个文件中。 如果这是一生中的一笔交易,那就把它放到/etc/limits.conf ,但明智的做法是创build一个像/etc/limit.d/raytracers这样的文件,并把这些文件放到里面(我们将限制奥维尔,而我们在它)。 有关详细信息,请参阅limits.conf手册页,示例位于/etc/limits.conf

  @newbie hard data 1024000 @newbie soft priority 20 @newbie hard priority 15 @newbie hard maxlogins 1 @outsider hard data 102400 @outsider soft 20 @outsider hard 20 @outsider hard maxlogins 1 @staff hard priority 10 @staff soft priority 15 

用户需要注销并重新login才能使更改生效。 你将会变得聪明,在将这些限制交给用户之前,先testing一下这些限制。 使用ulimit命令检查设置是否得到应用。 maxlogins是必需的,因为限制是应用每个loginshell,并且用户可以通过多次login来绕过它们。

好的,我们终于locking了用户,这样员工总是在机器上转弯。 现在是观察者。 这很难,因为不知何故,你必须弄清楚成为观察者意味着什么。 你有几百个你不想locking的标准命令。 所以要么保护所选的应用程序运行,要么强制它们运行一个主应用程序。 添加X-Windows(GNOME或KDE)确实使这个过程复杂化,并且需要您付出相当大的努力。 出于这个原因,你可能只想限制他们可以花费多lessCPU时间(当然是通过限制),然后把它留在那里。

但是,也许你为了获得POV-Ray而付出了巨额的资金,这就是老板想让观察者不能运行的原因。 只要做一个chgrp -R raytracers /directory/with/application/and/settings 。 然后,确保顶部树的权限为750这样观察者甚至不能进入目录并运行程序。

如果你只想让观察者运行一个特定的应用程序,那么你有两个select。 如果它是严格的文本环境,那么把他们的shell作为程序的名字,并确保程序在/etc/shells 。 您可能必须对PAM模块进行一些例外,以防止用户执行scpftp 。 如果是graphics环境,则必须修改窗口环境。 graphics环境相当复杂,完全locking,需要一些实验。

以下是一个testing问题:我们如何迫使员工的工作总是主宰新手和观察员的工作? (提示:查看/etc/limit.d/raytracers中的条目)

使用at / batch命令。

( 例子 )

阿尔曼

我已经想了几分钟你的问题,我想build议,这听起来像你可能完全错误的轨道。 这只是不适合nix如何运行的模式。

一个壳通常产生很less的过程TONS; 事情从一个到下一个pipe道input和输出,在这个系统的任何延迟将使它几乎无法使用。 如果你的系统资源是这样的,如果用户不能在没有排队的情况下运行grep,他们就会变得疯狂。

我会build议寻找其他道路。 一个人将在每个进程或每个用户的基础上尝试“好”的水平。 如果用户正在运行占用大量资源的作业,则可能会限制他们可以启动要排队的特定作业的方式,但作业本身的function应该针对此用例进行更新。

另一个需要考虑的事情是使用虚拟服务器或其他虚拟客户端来隔离虚拟环境中的用户,从而允许他们在所有的服务器资源中使用有限的一部分。

希望这可以帮助你一点点。 如果您分享了更多关于人们正在运行的消耗如此多资源的任务的信息,也许人们可以提供更精确的解决scheme。 就目前而言,我只是想说,这听起来好像是在用错误的工具来解决问题,就像是把车轮拉下来,然后像雪橇一样拖着它,就像是在阻止你的汽车上的平底车一样。 赶上我的漂移?

迦勒