计算化学公社

 找回密码 Forget password
 注册 Register
Views: 10132|回复 Reply: 10
打印 Print 上一主题 Last thread 下一主题 Next thread

[Linux] 分享个抢占资源的无耻脚本

[复制链接 Copy URL]

403

帖子

4

威望

2874

eV
积分
3357

Level 5 (御坂)

本帖最后由 万里云 于 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就是在一天之内每隔十秒查看一次资源,如果运气不是太差,没人抢得过你。
此脚本适用于多人共用同一服务器的情形,不适用于集群。

评分 Rate

参与人数
Participants 8
eV +36 收起 理由
Reason
LLG + 2 赞!
zsu007 + 5 牛!
kunkun + 5
ter20 + 5 谢谢
卡开发发 + 5
guo7212c + 4 赞!
sobereva + 5
ruanyang + 5 好物!

查看全部评分 View all ratings

35

帖子

0

威望

2257

eV
积分
2292

Level 5 (御坂)

2#
发表于 Post on 2015-7-9 14:59:30 | 只看该作者 Only view this author
果然很无耻 哈哈
可见  会写脚本是多么重要

293

帖子

8

威望

1694

eV
积分
2147

Level 5 (御坂)

3#
发表于 Post on 2015-7-10 04:24:44 | 只看该作者 Only view this author
如果有队列系统 怎么办

403

帖子

4

威望

2874

eV
积分
3357

Level 5 (御坂)

4#
 楼主 Author| 发表于 Post on 2015-7-10 08:39:23 | 只看该作者 Only view this author
smutao 发表于 2015-7-10 04:24
如果有队列系统 怎么办

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

有队列的不会出现抢资源的情况,所以用不到。

111

帖子

0

威望

4243

eV
积分
4354

Level 6 (一方通行)

5#
发表于 Post on 2015-7-11 23:21:09 | 只看该作者 Only view this author
收藏备用~~
gcq#413: "I know poetry is not dead, nor genius lost; nor has Mammon gained power over either, to bind or slay; they will both assert their existence, their presence, their liberty and strength again one day." (Jane Eyre in Jane Eyre by Charlotte Bronte)

8

帖子

0

威望

185

eV
积分
193

Level 3 能力者

6#
发表于 Post on 2015-8-28 16:35:51 | 只看该作者 Only view this author
本帖最后由 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 &
复制代码

评分 Rate

参与人数
Participants 2
eV +8 收起 理由
Reason
zsu007 + 5 赞!
sobereva + 3

查看全部评分 View all ratings

362

帖子

1

威望

4376

eV
积分
4758

Level 6 (一方通行)

7#
发表于 Post on 2019-12-8 10:38:23 | 只看该作者 Only view this author
If同时有两个人在用这个脚本会发生什么?

80

帖子

2

威望

596

eV
积分
716

Level 4 (黑子)

8#
发表于 Post on 2020-3-21 17:05:55 | 只看该作者 Only view this author
exity 发表于 2019-12-8 10:38
If同时有两个人在用这个脚本会发生什么?

你可以想象一下几万人同时用抢票软件的场景

1294

帖子

0

威望

6240

eV
积分
7534

Level 6 (一方通行)

9#
发表于 Post on 2020-3-21 18:12:02 | 只看该作者 Only view this author
这个无耻的脚本——————————我好喜欢。
https://www.x-mol.com/groups/fan_jianzhong

strive for greatness

15

帖子

0

威望

1944

eV
积分
1959

Level 5 (御坂)

10#
发表于 Post on 2020-4-16 22:22:55 | 只看该作者 Only view this author
拷贝一份备用

141

帖子

4

威望

1408

eV
积分
1629

Level 5 (御坂)

科研泥瓦匠

11#
发表于 Post on 2020-6-5 13:53:14 | 只看该作者 Only view this author
还是有自己的服务器好啊
终日寻春不见春
芒鞋踏破岭头云
归来偶把梅花嗅
春在枝头已十分

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-27 14:23 , Processed in 0.169517 second(s), 22 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list