计算化学公社

标题: 分享个抢占资源的无耻脚本 [打印本页]

作者
Author:
万里云    时间: 2015-7-9 11:08
标题: 分享个抢占资源的无耻脚本
本帖最后由 万里云 于 2015-7-9 11:10 编辑

其实一开始要我写这么个脚本我是拒绝的,因为不能让我写我就写,写完后独占机器,这样别人一定会骂我“你怎么这么无耻”。

后来发现不写不行,和那些每隔十几分钟就查看服务器资源的人相比,不花点心思,就一辈子都别想抢到资源了。
  1. #! /bin/bash

  2. function runjob()
  3. {
  4.     local ncpu=$1
  5.     # add your jobscripts here
  6.     echo "There are $ncpu idle CPU"
  7.     wait
  8. }

  9. function main()
  10. {
  11.     # programs to watch
  12.     local proglist="pw yambo vasp"

  13.     # toal number of cpus on this machine
  14.     # and min/max number of cpus for the job
  15.     local ncputot=16
  16.     local ncpumin=16
  17.     local ncpumax=16

  18.     # time step and maximum number of loop
  19.     local dt=10
  20.     local nmax=8640
  21.    

  22.     # main loop
  23.     for i in $(seq 1 $nmax); do
  24.         # initialize ncpuocc and ncpuemp
  25.         local ncpuocc=0
  26.         local ncpuemp=0
  27.         # determine ncpuocc and ncpuemp
  28.         for prog in $proglist; do
  29.             local ncpui=$(ps -e | grep "$prog" | wc -l)
  30.             ncpuocc=$(echo $ncpui $ncpuocc | awk '{print $1+$2}')
  31.         done
  32.         ncpuemp=$(echo $ncputot $ncpuocc | awk '{print $1-$2}')
  33.         # if ncpuemp >= ncpumin submit the job;
  34.         # else, wait for the next cycle.
  35.         if [ $ncpuemp -ge $ncpumin  ]; then
  36.             # if ncpuemp <= ncpumax, use ncpuemp cpus;
  37.             # else, use ncpumax cpus;
  38.             if [ $ncpuemp -le $ncpumax ]; then
  39.                 runjob $ncpuemp
  40.                 break
  41.             else
  42.                 runjob $ncpumax
  43.                 break
  44.             fi
  45.         else
  46.             sleep $dt
  47.         fi
  48.     done
  49.    

  50.     # exit
  51.     return 0
  52. }

  53. main
复制代码
算法不复杂,就是每隔一定时间根据当前机器上总核数和要监视的程序列表计算出可用核数,如果可用核数满足要求则运行任务。

需要修改的地方有这么几处:

runjob这个函数,把计算用的命令添加进去。这个函数已经从main函数接收了当前可用核数作为参数。

ncputot是该机器上CPU总核数,ncpumin是自己运行的任务所需最小核数(如程序算出来的可用核数不满足此条件则继续等待直至满足,为资源需求量大的程序设计),ncpumax是自己任务所用的最大核数(如果可用核数小于这个数,则使用可用核数,否则使用最大核数,避免占用太多资源)。

proglist是待监视的程序列表,main函数会统计由该列表中的程序占用的核数,与ncputot作差后得到可用核数。

dt是每隔多少秒检查一次资源,nmax是总共检查多少次。dt=10,nmax=8640就是在一天之内每隔十秒查看一次资源,如果运气不是太差,没人抢得过你。
此脚本适用于多人共用同一服务器的情形,不适用于集群。


作者
Author:
wull    时间: 2015-7-9 14:59
果然很无耻 哈哈
可见  会写脚本是多么重要
作者
Author:
smutao    时间: 2015-7-10 04:24
如果有队列系统 怎么办
作者
Author:
万里云    时间: 2015-7-10 08:39
smutao 发表于 2015-7-10 04:24
如果有队列系统 怎么办

这个就是针对无队列系统的。

有队列的不会出现抢资源的情况,所以用不到。
作者
Author:
qczgzly    时间: 2015-7-11 23:21
收藏备用~~
作者
Author:
bay618    时间: 2015-8-28 16:35
本帖最后由 bay618 于 2015-8-28 16:37 编辑

也分享一个自己写的吧, 实际上定义了两条命令loadint和waitload
  1. loadint () { echo " `uptime 2> /dev/null | awk -F ':|,' '{print($(NF-2))}'` / 0.99 " | bc ; }
  2. waitload () { while [ `loadint` -gt $1 ] ; do sleep 180 ; done ; }
复制代码

loadint 可以输出当前的负载, 以整数输出.
waitload 后面跟一个整数, 每隔一段时间检测一次, 当负载小于这个整数时候结束. 配合shell 的用法可以提交了.
比如下面的用法提交g09任务
  1. waitload 4 && g09 aaa.gjf &
复制代码

作者
Author:
exity    时间: 2019-12-8 10:38
If同时有两个人在用这个脚本会发生什么?
作者
Author:
pika02    时间: 2020-3-21 17:05
exity 发表于 2019-12-8 10:38
If同时有两个人在用这个脚本会发生什么?

你可以想象一下几万人同时用抢票软件的场景
作者
Author:
小范范1989    时间: 2020-3-21 18:12
这个无耻的脚本——————————我好喜欢。
作者
Author:
pinpo    时间: 2020-4-16 22:22
拷贝一份备用
作者
Author:
欢乐多    时间: 2020-6-5 13:53
还是有自己的服务器好啊




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3