用UTS gpu集群

Prerequisites

Accept offer、拿到学号、激活邮箱,可登录 myStudentAdmin 验证。登录服务器用的帐号是要另外申请、邮件告知的,但密码跟登 myStudentAdmin 是同一个。

国内/校外访问要连 UTS 的 vpn client。有两个:[3] 是 FortiClient,而 [4] 是 F5 Edge Client。[3] 那个好像连不了超算(不知道有没有记错,没有重新测试过),用 [4] 的可以,所以跟 [4] 步骤装软件、连 vpn 就好(UTS vpn 的页面 firefox 好像刷不出内容,可以试下用 chrome)。后续步骤都要连着操作,连申请帐号都要。

script error

2024.2.5 在国内用 [4] 的 F5 BIG-IP 连 iHPC 时,可能会遇到一个报错:
f5-error
然而半年前出国前(2023.7)没有这个报错,去到澳洲也不会。今次回国发现 F5 BIG-IP 软件更新了,不过无论新、旧 F5 BIG-IP 软件都报此错。发 ticket 问,说可能是 F5 BIG-IP 软件问题,让去 F5 Dynamic Webtopna_vpn_student图标是 Student VPN Tunnel)-> 点 Start,也会连 vpn(桌面菜单栏一个红圆形图标),然后就能连上 iHPC 了。
na_vpn_student

Request an iHPC Account

参照 [4],在 iHPC 主页[6] -> Account Request,填资料,submit,然后等他们创号(我等了几分钟,挺快),好了会发到 UTS 邮箱,有几封,其中一封 iHPC Admin 发来的邮件底部会告诉超算的用户名:
ihpc-email
Username 是登 iHPC 主页[6]、shell 连服务器的用户名;Password 那「standard UTS password」就是登 myStudentAdmin 那个密码。

Usage

在 [6] -> Login 登录,就会跳到 iHPC Overview[7],可以看到当前各集群的使用状态。集群是用行星命名的,如 Jupiter、Mars 等。点 Documentation 有介绍。

connecting

Access And Connectivity 介绍连集群的方法,其中命令行连看 Connecting via SSH Command Line[8]。几条基本信息:

  • IP / host name:access.ihpc.uts.edu.au,是登录节点/堡垒机
  • 用户名:前文邮件发那个
  • 密码:登 myStudentAdmin 那个

连进登录机后,参考 [8],可用 cnode 命令看集群信息(其实可以直接在 iHPC Overview 看?);选好要连的集群之后用 ssh <集群名> 连去相应集群,集群名在 iHPC Overview 有列出,如 mars1

有两个集群好像要另外申请才能连:Jupiter、Saturn,详见 [8]。

可以配 ssh 免密登录,然后用 VS Code 连。当用 xshell 连时,不知为何一但进入 screen 就会卡,而用 windows 自带的命令行、vs code 内的 terminal 连就不会。可简单写个连接脚本,方便用自带命令行连:

@echo off
set USER=用户名
set IP=access.ihpc.uts.edu.au
ssh %USER%@%IP%

如果有多个服务器连,可参考 [30] 写个脚本当简易 ssh client 用。

file stores

Getting Started[9] -> File Stores、File Systems[10] 有介绍存储空间,应该都是指连去特定集群后的空间,而不是登录机的。主要关注几点:

  • [10] 有讲各位置是否持久化目录(Survive Reboots? ),即重启之后数据保不保留;也讲是网盘还是本地盘(影响 IO 时间)。
  • home 目录(~):是各集群同步的,见 [9],所以 ssh 只在一个集群上配一次就好,会自动同步。只有 32G。
  • /data/<username>:也会同步,大很多,[9] 说限 1024G,可用来放数据和结果。
  • /share:也会同步,所有人可读写。
  • /scratch:所有人可读写的目录,[9] 说是说本地盘,所以 IO 会比 /data 快,但空间小一些,不用时要及时删东西省位。

environment

  • 有 screen(复用终端
  • 有网,连进集群之后可以直接连 github、gitee,也可以直接 wget 下 conda、用 pip、conda 装包。
  • cuda、cudnn 等 gpu 基础软件齐全,见 GPU Computations,在集群里 ls /usr/local 得:
    AnsysEM                 Cytoscape-3.9.1          nccl-2.15-11.8
    apptainer-1.1.9         DassaultSystemes2022     nccl-2.16-11.0
    arb-6.0.6               dock6                    nccl-2.16-11.8
    bin                     eclipse                  nccl-2.16-12.0
    blender-3.3.2           eeglab2022.1             nccl-2.6-10.0
    chimera-1.16            ESI_Software_2019.5      nccl-2.8-10.1
    cluster_reporter        ESI_Software_2021.5      nccl-2.8-11.1
    CodeBlocks-Fortran-1.7  etc                      nccl-2.8-11.2
    comsol61                FastQC                   nccl-2.9-11.3
    containers              feko                     NetLogo-6.3
    CST_STUDIO_SUITE_2022   Fiji.app                 openblas-0.3.21
    cuda-10.0               fragpipe                 openmpi-intel-4.1.1
    cuda-10.1               fragpipe16               ParaView-5.11.0
    cuda-10.2               FreeCAD                  Perseus
    cuda-11.0               games                    protobuf-3.19.6
    cuda-11.1               gephi-0.10.1             pycharm-community-2022
    cuda-11.2               gsl-2.7                  quantlib-1.27.1
    cuda-11.3               hyperworks               R-3.6
    cuda-11.4               IGV-2.15.4               R-4.1
    cuda-11.5               ImageJ                   R-4.2
    cuda-11.6               include                  R-4.3
    cuda-11.7               lib                      rstudio-2022
    cuda-11.8               lib64                    rstudio-2023
    cuda-12.0               libexec                  SAS-9.4
    cudnn7.6-10.0           matlab2020b              sbin
    cudnn8.0-10.1           matlab2021a              share
    cudnn8.2-10.2           matlab2021b              singularity-3.8.7
    cudnn8.2-11.4           matlab2022a              singularityce-3.10.5
    cudnn8.3-10.2           matlab2022b              Slicer-5.2.1
    cudnn8.3-11.5           matlab2023a              SPSS
    cudnn8.4-10.2           MaxQuant                 src
    cudnn8.4-11.6           MeshLab                  stata17
    cudnn8.5-10.2           NAG                      stata18
    cudnn8.5-11.7           ncbi-blast-2.13.0+       tecplot
    cudnn8.6-10.2           ncbi-blast-ihpc-2.13.0+  TensorRT-8.5-10.2
    cudnn8.6-11.8           nccl-2.11-11.4           TensorRT-8.5-11.8
    cudnn8.7-10.2           nccl-2.11-11.5           vmd-1.9.3
    cudnn8.7-11.8           nccl-2.12-11.6           VSCode-linux-x64
    cudnn8.8-11.8           nccl-2.14-11.7           weka-3.8.6
    cudnn8.8-12.0           nccl-2.15-10.2           Wolfram
    
  • singularity 镜像,在 /share/singularity_containers/

singularity

如果服务器已有的镜像不好用,如有包装不了(如 pytorch 1.2.0),可以自创 singularity 容器,基本用法、创建文件 recipe 写法、build 方法见 [17-21]。

在 UTS 的机器上写 recipe、build 都有些要另外注意的。recipe 示例,[21] 说 %post 中要加两句:

  • export DEBIAN_FRONTEND=noninteractive:当创建基于 ubuntu / debian 的容器时要;
  • mkdir -p /data /projects /scratch:这 3 个路径都是 UTS iHPC 的机器中有的,在 iHPC 机器上跑的 singularity 都会自动尝试挂载它们,要保证镜像中有这几个文件夹。
# py36_pt120
Bootstrap: docker
From: pytorch/pytorch:1.2-cuda10.0-cudnn7-runtime

%labels

Python 3.6.9
CUDA 10.0
cuDNN 7
PyTorch 1.2.0
torchvision 0.4.0

%post

# required by UTS iHPC
export DEBIAN_FRONTEND=noninteractive
mkdir -p /data /projects /scratch

# python packages
pip install --upgrade pip setuptools wheel
pip install --no-cache-dir \
    "scikit-learn>=0.23.2" "munkres>=1.1.4" "opencv-python==4.3.0.38" "numpy>=1.19.1" \
    click Cython easydict fire graphviz h5py matplotlib \
    ninja pandas PyYAML scipy tensorboard xlwt

build 的时候,[20] 说因为没有 root,[19] 的普通 build 命令可能不行,要用 [21] 的 builder,而 recipe、创建的镜像文件都要在 /scratch 下。步骤:

  • 连去某个集群,如 ssh mars1。后面创建要用 singularity_build 脚本,集群中才有,登录节点没有;
  • 将 recipe 复制去 /scratch/ 下的某个路径,如 /scratch/<username>/cd 过去;
  • 执行 singularity_build,提示、步骤参考 [21]:
    • Select the process you wish to perform,选 1Build from Recipe File);
    • Enter the full path of recipe file,按提示输入 recipe 的绝对路径,如 /scratch/<username>/py36_pt120
    • Do you wish to edit this recipe file using Vim? [y…n],问你要不要编辑 recipe,yn 跳过;
    • Select Container Type,一般选 1Image),如果要编译 cuda 代码(可能指 StyleGAN 那种有自写 cuda 文件的?)就选 2Image-nv)。其实感觉可以无脑选 2
    • Enter the name of the output container,创建的镜像像文件名,用写后缀名。如写 py36_pt120 则输出的文件就是 py36_pt120.sif
    • 等,创建完又会回到第一步,可以 10To exit)退出;
    • 将创建的镜像文件移去 /share/ 下,因为会同步,方便各结点调用。

用容器跑程序:singularity exec --nv /share/$(whoami)/py36_pt120.sif python main.py;或写一个驱动脚本(singu-run.sh),套娃执行真正的实验脚本(my_experiment.sh):

  • 参考 [35],支持串行执行多个 scripts。
#!/bin/bash
# singu-run.sh

IMAGE_F=/share/`whoami`/py36_pt120.sif

for s in ${@:1}; do
   if [ ! -f $s ]; then
   	echo No such file: $s
   else
   	singularity exec --nv $IMAGE_F bash `realpath $s`
   fi
done

然后:bash singu-run.sh my_experiment_1.sh my_experiment_2.sh

当在容器内用 pip 装包时,要注意用的是不是容器内的 pip,似乎默认的 pip 是宿主的(自己装的 miniconda 中的 pip),考虑用绝对路径调用容器内的 pip。

一些 singularity recipe 可见 iTomxy/ml-template/containers/singularity

jupyter notebook

命令行连去某 gpu 节点(如 mars28)后,开 jupyter notebook,想在本地浏览器打开,直接用 mars28 的 ip 连不上,可用 ssh 隧道转发,参考 [24,25],在本地(windows)运行:

  • (2023.11.8)参考 [32],可以同时转发多个 ports。
@REM tunnel.bat
@echo off

@REM 登录 gpu 节点的用户名、IP(登入 gpu 节点后 ifconfig 查)
set USER=itom
set IP=1.2.3.4

@REM 6006 是 tensorboard
@REM set REMOTE_PORT=6006
set TB_PORT=6006

@REM 8888 是 jupyter notebook
@REM set REMOTE_PORT=8888
set JN_PORT=8888

@REM 转发来本地 18888 端口(避免与本地开的 jupyter notebook 端口冲突)
@REM set LOCAL_PORT=1%REMOTE_PORT%

@REM ssh -L %LOCAL_PORT%:127.0.0.1:%REMOTE_PORT% %USER%@%IP%
ssh -L 1%TB_PORT%:127.0.0.1:%TB_PORT% ^
	-L 1%JN_PORT%:127.0.0.1:%JN_PORT% ^
	%USER%@%IP%

然后在本地浏览器打开网址:localhost:18888。遇到过报错:

Bad local forwarding specification '18888'

参考 [26],当时注释是写在端口号后的,即:

...
@REM set REMOTE_PORT=6006 @REM 6006 是 tensorboard
set REMOTE_PORT=8888 @REM 8888 是 jupyter notebook
...

后将注释放在上面一行,就行了。

同样,也要注意用的是不是容器内的 jupyter,如进了一个 tensorflow 的容器,用容器内的 pip 装了一个 jupyter,但默认的 jupyter 却是宿主机的 jupyter。考虑用 whereis jupyter 找有哪些 jupyter,似乎 ~/.local/bin/jupyter 就是在容器内装的(因为这样开出的 notebook 能 import tensorflow 成功),而如果是用 recipe build singularity 镜像时装的 jupyter,则在 /usr/local/bin/jupyter

hosts

前一节用 tunneling 每次都要登上相应 gpu 结点用 ifconfig 查 IP,麻烦,想直接用 mercury4 等别名连,可以把登录结点的 hosts 文件内容复制一份在本地。登录结点的 hosts 文件在 /etc/hosts,Windows 本地的 hosts 文件在 C:\Windows\System32\drivers\etc\hosts。先将本地的 hosts 重命名备份(如 hosts.bak),再将重登录结点下载来的 hosts 文件复制过去,本地 windows 电脑就也可以直接 ssh mercury4 连接了。

Sieving Clusters

想像 [11] 一样,用脚本筛选能用的集群。首先 cnode all 的输出形如:

*******************************************************
*               Welcome to the iHPC                   *
*                                                     *
*    To connect to a node use the ssh command         *
*    (eg. ssh mars6).                                 *
*                                                     *
*******************************************************
 
   Node   Index	 Connect  %CPU	 %Mem	 %GPU	 %GPU Mem   User(s) 
 jupiter1   3      no	  100.0	 11.4	 	 	    edehghan,dmartins
    mars1   3      no	   0.5	 4.9	 0.0%	 0.1%	    xwang12,mfeizi
   mars24   2     yes	   1.6	 5.3	 0.0%	 0.1%	    aetminan
 mercury8   0     yes	   0.5	 7.7	 0.0%	 0.3%
(...更多...)
  • Node 是 host name,用 ssh <node> 连;
  • Connect 表明能不能连,因为每个集群最多同时连两个人,User(s) 是正在连的用户;
  • %GPU 是 gpu load、%GPU Mem 是显存占比,如果集群无 gpu 则此两列为空,如 jupiter1

command

#!/bin/bash
# find-nodes.sh

cnode all | \
	awk 'NR > 10 && NF > 6 {print $1" "$3" "$4" "$6" "$7}' | \
	grep -v 'jupiter' | \
	grep yes | \
	awk '{print $1" "$3" "$4" "$5}' | \
	sort -n -k 3 -k 2 -k 4 | \
	awk '{if (length($1) > 7) print $1"\t"$2"\t"$3"\t"$4; else print $1"\t\t"$2"\t"$3"\t"$4;}'

其中:

  • awk 'NR > 10 && NF > 6 {print $1" "$3" "$4" "$6" "$7}',虑掉前面一些 welcome 输出和元信息(NR > 10)、无 gpu 的行(NF > 6),只输出 NodeConnect%CPU%GPU%GPU Mem 4 列(NR 是当前行数;NF 是当前行的列数,默认空格分隔。都从 1 开始);
  • grep -v 'jupiter' 筛掉 jupiter 和 saturn 的集群,因为要另外申请,还没申 jupyter 没有 gpu;
  • grep yes 选能连的;
  • awk '{print $1" "$3" "$4" "$5}' 去掉 Connect 一列;
  • sort -n -k 3 -k 2 -k 4 升序排序,优先级:%GPU > %CPU > %GPU Mem
  • awk '{if (length($1) > 7) print $1"\t"$2"\t"$3"\t"$4; else print $1"\t\t"$2"\t"$3"\t"$4;}' 制表符美化输出,可以合并到第二条 awk 命令中。

可以写入一个 shell 文件(如 find-nodes.sh),chmod u+x find-nodes.sh 辅权之后,放在 $PATH 内的某个目录内(如 ~/.local/bin/,可以 echo $PATH 看有哪些)方便调用。如果只想找一个可用服务器连入去,而不关心是哪个,可以:ssh $(find-nodes.sh | head -n 1 | awk '{print $1}')

greedy picking

想用命令自动(贪心地)按 cpu、gpu、gpu men 三项之和升序排列,然后选第一个节点连,而不是用 find-nodes.sh 打印之后,再手动 ssh 连。由 find-nodes.sh 改一个辅助脚本 gpu.sh

#!/bin/bash
cnode all | \
        awk 'NR > 10 && NF > 6 {print $1" "$3" "$4" "$6" "$7}' | \
        grep yes | \
        awk '{print $1" "$3" "$4" "$5}' | \
        sed "s/\([a-z]\+[0-9]\+\) \([0-9\.]\+\) \([0-9\.]\+\)% \([0-9\.]\+\)%/\1 \2 \3 \4/" | \
        awk '{print $1" "$2+$3+$4}' | \
        sort -n -k 2 | \
        awk '{print $1}' | \
        head -n 1

放入 ~/.local/bin/chmod u+x gpu.sh 加执行权限。再加一个命令入 ~/.bashrcpick):

alias pick='ssh $(gpu.sh)'

source ~/.bashrc 刷新后就可以敲 pick 连去一个 gpu 结点。

auto exiting

占住计算节点 2 天不跑会收到邮件,3 天就有另一封警告邮件,说再发生就销 iHPC 号……如果想脚本跑完程序自动推出计算节点,参考 [29],可以用 hostname 命令判断当前在不在计算节点上:

  • 登录节点叫 janus0
# run.sh

# 跑实验
python main.py

# 自动断连
host=`hostname` # mars18.ihpc.uts.edu
host=${host%%\.*} # mars18
if [ $host != "janus0" ]; then exit; fi

然后,在命令行里用 . 运行:. run.sh,而是用 bash,因为 bash run.sh 会创建一个子 shell(子进程),子 shell 退出而主 shell 还连着。

可以用 cnode all | grep $(whoami) 找到现在正连着的计算结点。为方便,可在 ~/.bashrc 中自定义一个命令(whereami),用 vim ~/.bashrc 编辑,加一句:

alias whereami='cnode all | grep `whoami`'

然后 source ~/.bashrc 刷新。

monitoring job

参考 [34],用 jmon 命令监视 cpu 占用,当一个核的 cpu 降到 25% 以下,会发邮件通知。不过如果另一个人在连、或自己同时跑多个实验时可能不准。

NoMachine

iHPC 用一个叫 NoMachine 的软件提供图形界面连接。然而改 ~/.bashrc 可能会导致图形界面连不了,即在登录界面输入帐号、密码之后,一直卡在 Creating a new virtual desktop 的转圈界面。但命令行连不受影响。
gui-login

  • 2024.7.16,经测试,原因是 ~/.bashrc 内一条我自己加的 conda activate cu116_pt1131 命令激活了一个虚拟环境,可能有些包有冲突?删掉就行。而装 conda 时自动写入 ~/.bashrc 的那段命令不影响,形如:
    # >>> conda initialize >>>
    # !! Contents within this block are managed by 'conda init' !!
    __conda_setup="$('/data/itom/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
    if [ $? -eq 0 ]; then
            eval "$__conda_setup"
    else
            if [ -f "/data/itom/miniconda3/etc/profile.d/conda.sh" ]; then
                    . "/data/itom/miniconda3/etc/profile.d/conda.sh"
            else
                    export PATH="/data/itom/miniconda3/bin:$PATH"
            fi
    fi
    unset __conda_setup
    # <<< conda initialize <<<
    
    这段可以留着。
  • 2023.12.21 初步怀疑是在 ~/.bashrc 中改 LD_LIBRARY_PATH 会引起此结果,但不确定,待测试。
  • 2024.1.3,经测试,~/.bashrc 中加 alias、改 LD_LIBRARY_PATH、改 PS1、加 conda 的初始化命令、用 /usr/bin/python 执行一个自己写的 python 脚本,并不影响图形界面登录。不过通过在 .bashrc 中加打 log 命令:
    # 在 ~/.bashrc 加一句 logging,测试图形界面登录会否调用 .bashrc
    echo $(date) GUI >> gui-login.log
    
    并用图形界面登录结点可知,用图形界面登录确实会调用(且是两次).bashrc,问题很可能是出在改 .bashrc,但仍不确定具体是哪出问题。

Something Else

Building 2 某自习室是升降台,型号是 ICF motion rectangular,发现一开始高度只能升到 780mm 就卡住,不能站着工作。在网页右下角客服聊天那要了一份说明书(instructions),其实高度可调最大范围是 [670, 1320] mm,但它可能根据使用习惯自动定死在一个更小的范围,要重调这个范围。分 set highest / lowest height limit,方法类似:

  1. 同时按 ↑ \uparrow ↓ \downarrow 两秒;
  2. 按住 ↑ \uparrow 同时连按 3 次 ↓ \downarrow 如重置上界),或按住 ↓ \downarrow 同时连按 3 次 ↑ \uparrow 如重置下界);
  3. 然后按 ↑ \uparrow (或 ↓ \downarrow )就可以调到更高(或低)了。

assigned laptop

Research student 学校会发一台电脑,同时送电脑包、键鼠套装。键鼠套装是 Dell KM7120W Multi-Device Wirreless Keyboard and Mouse Combo,键盘有 Fn 键,F1 ~ F12 默认不是 F1 ~ F12,而是功能键。想改回默认 F1 ~ F12 的话,参考 [22],按 Fn + Esc,就可以了。 这电脑时不时要更新,更完之后 Rime 就会挂(2023.10.4),暂不知原因,需要再重启一次。

此手提有限制,如一些网页会被 block,另收到警告邮件说探测到 a critical matter regarding the security of our devices,让拿电脑去 cb11.05.204 检查电脑。他们那有具体引发问题的文件路径,如:

  • C:\Users<学号>\AppData\Local\Temp\OnlineInstall\11.4.8.2122\SDK\DownloadSDKServer.exe
  • C:\Users<学号>\AppData\Local\Programs\Thunder\Program\Win7AppId.exe

两个都跟迅雷有关。他们会要求:

  • 删软件和相关文件;
  • 用 Windows Security 做 full scan,如果扫出甚么有风险的东西也删掉,最后将结果截图发给他们。

用破解版 IDM 会被发现并禁网,他们叫 isolation,禁了之后 UTS 的手提能连上 UTS-WiFi,但上不了网,连自己屋的 wifi、手机热点也上不了网,说是一旦连上了,学校就能监测到,并封锁。须要他们解除 isolation。

不知道下次要装什么是不是要在虚拟机里搞才比较稳……UTS 有软件列表,见 [27,28],里面有 VMware。

此手提会用 onedrive 同步文件,在资源管理器左侧的 OneDrive - UTS 可以看到有哪些目录会被同步,桌面在其中,就连软链接[31]文件夹内的文件都会同步,如数据放在 *%USERPROFILE%\data* 下,这里不会同步,但为了打开方便,参照 [31] 在桌面创了个它的软链接:mklink /d "%USERPROFILE%\OneDrive - UTS\Desktop\data" %USERPROFILE%\data,这样的话,data\ 下的文件也会被 onedrive 同步。想避免同步,不创软链接,改过在桌面用 bat 文件用命令打开文件夹:

@REM data.bat
@start %USERPROFILE%\data

这样 onedrive 就只会同步这个 data.bat 而不会同步整个 data\。另,TIM、微信有文件在 OneDrive - UTS\Documents\ 下,即 Tencent Files\、WeChat Files\,挺大,又时不时会变,onedrive 好像一直在处理它们里面的文件,又取消不掉,要在软件内改掉放文件的位置。

latex template

SEDE(School of Electrical and Data Engineering)的 thesis latex 模板见 [23]。

References

  1. UTS访学参考
  2. 如何在UTS iHPC集群上配置conda环境
  3. UTS VPN Guide
  4. iHPC - Creating an account
  5. High Performance Computing,超算介绍,「Access to all UTS Systems」一节有导向 [4] 的链接。
  6. UTS iHPC
  7. iHPC Overview
  8. Connecting via SSH Command Line
  9. Getting Started
  10. File Systems
  11. shell监视gpu使用情况
  12. awk打印列数
  13. awk 'NR==1 {print $1} 这句shell语句是什么意思
  14. awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS
  15. 在linux系统如何grep过滤中,不包含某些字符串的命令
  16. Linux Shell sort排序常用命令
  17. singularity基本用法
  18. Container Recipes
  19. Build a Container
  20. iHPC Singularity
  21. iHPC Singularity Builder
  22. How to do Fn Lock on Dell Wireless Keyboard KM5221W so F1 - F12 keys work normally?
  23. Daniel Franklin/SEDE SRMC Templates and Examples
  24. How can I run Tensorboard on a remote server?
  25. iTomxy/ml-template/scripts/tunnel.bat
  26. Bad local forwarding specification while connecting to cluster
  27. Software download
  28. Software available to students
  29. How can I get the hostname of the machine I work on?
  30. 手写dos batch简易ssh client
  31. windows软链接
  32. ssh -L forward multiple ports
  33. Test if the first character is a number using awk
  34. Monitoring Computations With Jmon
  35. Take the first command line argument and pass the rest
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值