第 1 部分 编程开发环境与工作流
主讲老师:王赫
2023/11/12
ICTP-AP, UCAS
# Response
# Linux
在哪里可以了解有关Linux的更多信息?
# Linux
$man
# 空格键: 下翻一页
# PaGe down 向下翻一页
# PaGe up 向上翻一页
# home 直接前往首页
# end 直接前往尾页
# / 从上至下搜索某个关键词,如“/linux”
# ? 从下至上搜索某个关键词,如“?linux”
# n 定位到下一个搜索到的关键词
# N 定位到上一个搜索到的关键词
# q 退出帮助文档
$ pwd
$ reboot
$ ls
$ clear
$ date
Linux 命令的格式: >> 命令名称 [命令参数] [命令对象]
语法中的"动词"
用于对命令的调整
“长格式” vs “短格式”
命令执行后的“承受方”
# Linux
$echo [字符串] [$变量]
$date [+指定的格式]
$reboot # 最好是以root管理员的身份来重启
$poweroff # 同上
$shutdown now -r # 立刻重启
$wget [参数] 网址
# -b 后台下载模式
# -P 下载到指定目录
# -c 断点续传
# -r 递归下载
$ps [参数] # 查看系统中的进程状态
# -a 显示所有进程(包括其他用户的进程)
# -u 用户以及其他详细信息
# -x 显示没有控制终端的进程
$ps -aux
$ps -ef # *所有进程*的*完整*信息
# UID 进程的用户ID
# PID 进程的唯一标识符,即进程ID
# PPID:父进程的进程ID
# C:进程的CPU使用率
# STIME:进程的启动时间
# TTY:进程所属的终端
# TIME:进程的运行时间
# CMD:进程的命令
$ps aux
# Linux
$top # 动态地监视进程活动及系统负载等信息
$kill [参数] 进程的PID # 终止某个指定PID值的服务进程
$killall [参数] 服务名称 # 终止某个指定名称的服务所对应的全部进程
第1行:系统时间、运行时间、登录终端数、系统负载(3个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。
第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示,例如“99.9 id”意味着有99.9%的CPU处理器资源处于空闲。
第4行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量。
第5行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量。
$ifconfig [参数] [网络设备] # 获取网卡配置与网络状态等信息
$ping [参数] 主机地址 # 测试主机之间的网络连通性
$uname -a
# 内核名称、主机名、内核发行版本、节点名、压制时间、
# 硬件名称、硬件平台、处理器类型以及操作系统名称
$uptime # 查看系统的负载信息
$free -h # 当前系统中内存的使用量信息
# Linux
$history [-c] # 显示执行过的命令历史
# 历史命令会被保存到用户家目录中的.bash_history文件中
$cat ~/.bash_history
$htop # 交互式进程查看器
$watch
$pwd # 显示用户当前所处的工作目录
$cd [参数] [目录]
$ls [参数] [文件名称]
$ls -lth
$chmod # 设置文件的一般权限及特殊权限
$id [用户名] # 显示用户的详细信息
$useradd [参数] 用户名
$passwd [参数] 用户名
$userdel [参数] 用户名
$su [用户名] # 切换用户身份
$sudo [参数] 用户名 # 把特定命令的执行权限赋予指定用户
$visudo [参数] # 编辑、配置用户sudo的权限文件
# Linux
$find [查找范围] 寻找条件 # 按照指定条件来查找文件所对应的位置
# -name 匹配名称
# -perm 匹配权限(mode为完全匹配,-mode为包含即可)
# -user 匹配所有者
# -group 匹配所有组
# -mtime -n +n 匹配修改内容的时间(-n指n天以内,+n指n天以前)
# -atime -n +n 匹配访问文件的时间(-n指n天以内,+n指n天以前)
# -ctime -n +n 匹配修改文件权限的时间(-n指n天以内,+n指n天以前)
# -nouser 匹配无所有者的文件
# -nogroup 匹配无所有组的文件
# -newer f1 !f2 匹配比文件f1新但比f2旧的文件
# -type b/d/c/p/l/f 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件)
# -size 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件)
# -prune 忽略某个目录
# -exec …… {}\; 后面可跟用于进一步处理搜索结果的命令
# 获取保存系统配置文件的目录/etc中所有以host开头的文件列表
$find /etc -name "host*" -print
# 在整个文件系统中找出所有归属于 ubuntu 用户的文件并复制到 /root/findresults 目录中
$find / -user ubuntu -exec cp -a {} /root/findresults/ \;
# 重点是“-exec {} \;”参数,其中的{}表示find命令搜索出的每一个文件,并且命令的结尾必须是“\;”。
$whereis 命令名称 # 按照名称快速搜索二进制程序(命令)、源代码以及帮助文件所对应的位置
$which 命令名称 # 按照指定名称快速搜索二进制程序(命令)所对应的位置
$df -h # 查看磁盘占用的空间
$du -sh 目录/文件 # 查看目录/文件的真实大小
See more: 论Linux文件系统
# Linux
$cat [参数] 文件名称 # 查看纯文本文件(内容较少的)
$cat -n 文件名称 # 顺便显示行号
$more [参数] 文件名称 # 查看纯文本文件(内容较多的)
$head [参数] 文件名称 # 查看纯文本文件的前 N 行
$tail [参数] 文件名称 # 查看纯文本文件的后 N 行
$tail -f 文件名称 # 能够持续刷新一个文件的内容
$wc [参数] 文件名称 # 统计指定文本文件的行数、字数或字节数
# -l 只显示行数
# -w 只显示单词数
# -c 只显示字节数
$wc -l /etc/passwd # 统计当前系统中有多少个用户
$stat 文件名称 # 查看文件的具体存储细节和时间等信息
# Access Time(内容最后一次被访问的时间,简称为Atime)
# Modify Time(内容最后一次被修改的时间,简称为Mtime)
# Change Time(文件属性最后一次被修改的时间,简称为Ctime)
$grep [参数] 文件名称 # 按"行"提取文本内容
$grep -n 文件名称 # 顺便显示行号
$grep -v 文件名称 # 反选信息
$grep /sbin/nologin /etc/passwd # 查找出当前系统中不允许登录系统的所有用户的信息
$touch [参数] 文件名称 # 创建空白文件或设置文件的时间
$mkdir [参数] 目录名称 # 创建空白的目录
$mkdir -p 嵌套层叠关系的目录
$cp [参数] 源文件名称 目标文件名称
# 如果目标文件是目录,则会把源文件复制到该目录中;
# 如果目标文件也是普通文件,则会询问是否要覆盖它;
# 如果目标文件不存在,则执行正常的复制操作。
# -p 保留原始文件的属性
# -d 若对象为“链接文件”,则保留该“链接文件”的属性
# -r 递归持续复制(用于目录)
# -i 若目标文件存在则询问是否覆盖
# -a 相当于-pdr(p、d、r为上述参数)
$rm [参数] 文件名称
# -f 强制执行
# -i 删除前询问
# -r 删除目录
# -v 显示过程
# Linux
标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
See more: 通配符和转义字符
命令在Linux中的执行分为4个步骤:
# Linux
See more:
# Linux
$scp [参数] 本地文件 远程账户@远程IP地址:远程目录
# -v 显示详细的连接进度
# -P 指定远程主机的sshd端口号
# -r 用于传送文件夹
# -6 使用IPv6协议
$ssh [参数] 远程账户@[远程IP地址]
# -p 指定远程主机的sshd端口号
$rsync -avzP -e 'ssh -p 端口号' 本地文件 远程账户@远程IP地址:远程目录
See more: Linux/Unix 中 Screen 命令详解
Screen 是一款由 GNU 计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen 可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
$screen -S yourname #-> 新建一个叫 yourname 的 session
$screen -ls #-> 列出当前所有的 session
$screen -r yourname #-> 回到 yourname 这个session
$screen -x yourname #-> 回到 yourname 这个已经 attached session
$screen -d yourname #-> 远程 detach 某个session
$screen -d -r yourname #-> 结束当前 session 并回到 yourname 这个 session
# Linux Containers
2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。
详细的 Docker 介绍可见:https://docker_practice.gitee.io/introduction/what.html
# Linux Containers
# 安装完成后,运行下面的命令,验证是否安装成功。
$docker version
$docker info
# 如果 docker 服务没有启动,可以用下面的命令启动
# 以下命令仅适用于 Linux 系统 service 命令的用法
$sudo service docker start
# systemctl 命令的用法 (RHEL7/Centos7)
$sudo systemctl start docker
# 抓取官方的 hello-world 镜像:
$sudo docker image pull hello-world
# 查看
$sudo docker images
# 运行这个 image 文件。
$sudo docker container run hello-world
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# ... ...
# (运行成功!)
$sudo docker images # 查看本机所有的镜像
$sudo docker ps -a # 查看本机所有的容器
$sudo docker rm [containerID] # 删除容器
$sudo docker image rm [imageID] # 删除镜像
# Linux Containers
# Base Image
FROM python:3.10
# 将当前目录下的所有文件(除了.dockerignore排除的路径)
# 都拷贝进入 image 里的/home/ictp_ap目录
COPY . /home/ictp_ap
# 将容器 8000 端口暴露出来, 允许外部连接这个端口
EXPOSE 8000
# 指定接下来的工作路径为/home/ictp_ap
WORKDIR /home/ictp_ap
RUN apt-get update && apt-get install \
-y --no-install-recommends \
python3-setuptools \
python3-pip \
python3-dev \
python3-venv \
git \
&& \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN python -c "print('hello world')"
# 将这个 image 做成一个 app 可执行程序
# 容器启动后自动执行下面指令
#(ENTRYPOINT 可加额外的shell参数)
ENTRYPOINT ["bash", "setup.sh"]
#!/bin/bash
var="Hello World"
# Run date and hostname command and s
# tore output to shell variables
now="$(date)"
computer_name="$(hostname)"
# print it or use the variable
# Variable names are case sensitive $now
# and $NOW are different names
#
echo "$var"
echo "Current date and time : $now"
echo "Computer name : $computer_name"
echo ""
# Linux Containers
FROM ubuntu:20.04
LABEL MAINTAINER="He Wang<hewang@ucas.ac.cn>"
ARG RELEASE_NAME=focal
ARG ROOT_PASSWD=root
ENV SSH_PORT 22
ENV PATH /root/miniconda3/bin:$PATH
# Open port
EXPOSE 8888
EXPOSE 22
#
# UTF-8 encoding to support chs characters
#
RUN echo "export LANG=C.UTF-8" >>/etc/profile \
#
# apt sources backup
#
&& cp /etc/apt/sources.list /etc/apt/sources.list.bak \
#
# switch apt source to TUNA
#
&& echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ release-name main restricted universe multiverse\n\
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ release-name-updates main restricted universe multiverse\n\
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ release-name-backports main restricted universe multiverse\n\
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ release-name-security main restricted universe multiverse" >/etc/apt/sources.list \
&& sed -i 's/release-name/'$RELEASE_NAME'/g' /etc/apt/sources.list \
#
# remove nvidia sources
#
# && rm /etc/apt/sources.list.d/cuda.list /etc/apt/sources.list.d/nvidia-ml.list \
#
# install necessary packages
#
&& apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
apt-utils \
vim \
openssh-server \
net-tools \
iputils-ping \
wget \
curl \
git \
iptables \
bzip2 \
command-not-found \
ca-certificates \
#
# download & install miniconda
#
&& wget -q https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm Miniconda3-latest-Linux-x86_64.sh \
&& ln -s /root/miniconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh \
#
# switch conda source to TUNA
#
&& echo "channels:\n\
- defaults\n\
show_channel_urls: true\n\
default_channels:\n\
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main\n\
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r\n\
custom_channels:\n\
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n\
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n\
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n\
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n\
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" >/root/.condarc \
#
# create conda py39 environment
#
&& /root/miniconda3/bin/conda create -n py39 python=3.9 -y \
#
# switch pip source to TUNA & update pip
#
&& /root/miniconda3/envs/py39/bin/pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
&& /root/miniconda3/envs/py39/bin/pip install pip -U \
#
# enable root access with ssh: replace line starts with '#PermitRootLogin' or 'PermitRootLogin'
#
&& sed -i '/^#*PermitRootLogin/cPermitRootLogin yes' /etc/ssh/sshd_config \
#
# set root password
#
&& echo "root:$ROOT_PASSWD" \
&& echo "root:$ROOT_PASSWD" | chpasswd \
#
# change ssh port & start ssh service when docker container starts
#
&& echo "#!/bin/bash\n\
sed -i \"s/Port 22/Port \$SSH_PORT/g\" /etc/ssh/sshd_config\n\
service ssh start\n\
/bin/bash" >./startup.sh \
&& chmod 777 ./startup.sh \
#
# add welcome tips
#
&& CONDA_VERSION=`/root/miniconda3/condabin/conda -V` \
&& CONDA_VERSION=${CONDA_VERSION#* } \
&& echo "\
printf '\\\n'\n\
printf '\\\033[0;34m'\n\
printf 'Welcome to ICTP-AP server\\\n'\n\
printf 'Please change the default root password in time\\\n'\n\
printf '\\\n'\n\
printf ' Conda:\\\t\\\tMiniconda v$CONDA_VERSION use \`conda activate py39\` to activate conda env\\\n'\n\
printf ' SSH port:\\\t$SSH_PORT for this container\\\n'\n\
printf '\\\033[0m'\n\
printf '\\\n'\n\
" >>/etc/update-motd.d/10-help-text \
#
# cleanup
#
&& rm -rf /var/lib/apt/lists/* /tmp/*
#
# set startup script
#
ENTRYPOINT ./startup.sh
#!/bin/bash
sudo docker build -t ictp_ap_jupyter .
#!/bin/bash
sudo docker run -itd \
-p 1234:22 \
-p 19999:8888 \
--name ictp_ap_dev \
ictp_ap_jupyter
ssh -p 1234 root@0.0.0.0
$sudo docker stop [containerID] # 终止容器运行
# 标注用户名和版本
$sudo docker tag [imageName] [username]/[respository]:[tag]
# 发布image文件
$sudo docker image push [username]/[respository]:[tag]
# Linux Containers
# 创建 conda 环境
conda create -n ictp-ap python=3.10 --yes
# 激活 conda 环境
conda activate ictp-ap
# 安装 JupyterNotebook 内核
pip install --upgrade ipykernel
# 安装一个扩展插件
pip install jupyterlab_nvdashboard
# 给 ictp-ap conda环境创建同名 kernel
python -s -m ipykernel install \
--user \
--name=ictp-ap \
--display-name="ictp-ap"
#!/bin/bash
nohup jupyter-lab \
--ip='*' \
--port=8888 \
--no-browser \
--NotebookApp.token='' \
--allow-root \
--autoreload \
--notebook-dir=/home \
> jupyter.log 2>&1 &
sudo docker pull iphysresearch/ictp_ap_jupyter:1.5
sudo docker run -itd --platform linux/amd64 \
-p 1234:22 \
-p 19999:8888 \
-v /Users/herb/ICTP_AP_course:/home/ICTP_AP_course \
--name ictp_ap_dev \
iphysresearch/ictp_ap_jupyter:1.0
ssh -p 1234 root@0.0.0.0
# Linux Containers
# ~/.ssh/config
Host ICTP_AP_course
HostName 0.0.0.0
User root
Port 1234
# Homework
基础作业:
扩展作业:
Repo of the course: https://github.com/iphysresearch/GWData-Bootcamp
# Self-Mastery
# Git
现代的版本控制系统可以帮助您轻松地(甚至自动地)回答以下问题:
坚果云
paper和response 的修改跟踪