Linux使用指南

Programming · 16 天前

常用资源

清华镜像源:https://pypi.tuna.tsinghua.edu.cn/simple

NONMEM部署服务器ip:47.112.22.165

常用指令

查看磁盘占用情况:df ./

mkdir 创建文件夹(根目录)

tar -xvf 解压名为filename的压缩包到该目录下(到同名子文件夹中)

mv A B 将文件夹A重命名为B

rm -rf 将及file下的所有文件全部删除(如rm -rf Node/,不仅把名为Node的文件夹中的东西全部删除了,Node文件夹也被删除了)

vi 在命令行中打开filename,按i进行编辑(insert),按esc退出编辑状态,接着输入:q!(不保存文件,强制退出),:w(保存文件,但不退出vi命令),:wq(保存文件并退出vi命令)

系统使用

文件传输

从服务器上下载文件或者上传文件到远程服务器,有两种办法,一是用有图形界面的软件,如FileZilla、MobaXterm等;二是可以建立sftp连接(这种办法适用于类Unix系统,如Mac):在Mac中打开终端,左上角点击新建连接,新建SFTP连接,命令行输入sftp 用户名@ip,输入密码,即可建立安全FTP连接进行文件传输,传输用put指令:put 地址1 地址2,可以将地址1的文件传输到地址2上

开启端口方法

开启方法:既要在阿里云控制台安全组开启端口,最好同时也设置一下防火墙,开启相应端口

  1. 需要先安装firewalld:apt install firewalld
  2. 查看当前端口开放情况:sudo firewall-cmd --list-portssudo firewall-cmd --list-all
  3. 开放端口(永久开放):sudo firewall-cmd --permanent --add-port=8000/tcp \ sudo firewall-cmd --reload

当开启端口后,尽管后端程序正常运行,但访问端口(可以用curl测试)仍提示denied,则要看一看开放的IP和端口是否设置正确,本地IP localhost对应数字为0.0.0.0,不要和127.0.0.1之类的搞混了(!!!很重要,Agent项目部署NONMEM时在此处踩坑了,uvicorn默认运行在127.0.0.1上,但想当然以为是0.0.0.0,导致一直访问拒绝,排查了很久,正确办法是要设置unicorn的ip:uvicorn main:app --host 0.0.0.0 --port 8000 --reload)排查办法是,看系统是否有在正常监听端口:sudo ss -tuln | grep 8000,根据返回的信息确定IP和端口号

环境变量设置

临时更新

直接在命令行输入:

export PATH=$PATH:/your/new/path
export MY_VAR="HelloWorld"

此类变量在当前 shell 进程中有效,关闭终端就会失效,因此常用于临时测试或脚本运行

永久更新

需要编辑~/.bashrc文件:nano ~/.bashrc,用鼠标滚轮或向下按键划到最后一行,在文件末尾添加同上的命令:

export PATH=$PATH:/your/new/path
export MY_VAR="HelloWorld"

编辑完成后Ctrl+S保存,Ctrl+X退出,再执行source ~/.bashrc即可更新环境变量

查看当前环境变量

  • 查看某个变量的值:echo $PATH 或者echo $MY_VAR
  • 查看所有环境变量:printenv或者env

Docker

主要组成部分:容器和镜像,在容器里运行镜像

创建Docker

查看docker列表:docker container list或者docker ps

创建docker镜像(需要提前写好dockerfile放在相应目录下):docker build -t <name> . (别忘了后面的点)

注意事项:

  • 如果更新了dockerfile,那就只能重新执行docker build来重建环境,docker里面没有sudo指令,要安装什么包和库,提前在dockerfile中写好相应指令安装,如果安装得慢,记得换源
  • docker存放位置:/var/lib/docker
  • 有时候构建docker时安装包会抽风,可能是dns配置的问题,此时需要重启一下docker服务:sudo systemctl restart docker便能正常解决

运行Docker

运行docker:docker run -d -p 8000:8000 --name <容器名称> <镜像名称>

指令组成部分解析:-d表示detached模式,后台运行,-p 8000:8000表示即将主机的8000端口映射到容器的8000端口,格式为主机端口:容器端口;--name nmtest_fastapi表示给这个容器起名为nmtest_fastapi,便于后续管理,比如logs, stop

进入到docker:docker run -it <name> /bin/bash或者docker exec -it <name> sh(退出:exit)

停止docker运行:docker stop <name>

查看docker完整运行日志:docker logs <name>

文件复制

如果要修改文件,尽量使用docker cp指令将本地修改好的文件复制过去,否则会污染docker的历史

语法

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
  • SRC_PATH: 源路径(可以是容器内的路径或宿主机的路径)。
  • CONTAINER: 容器的名称或 ID。
  • DEST_PATH: 目标路径(可以是容器内的路径或宿主机的路径)。

从容器复制文件到宿主机

docker cp my_container:/path/in/container /path/on/host

将容器 my_container 内的 /path/in/container 文件或目录复制到宿主机的 /path/on/host。

从宿主机复制文件到容器

docker cp /path/on/host my_container:/path/in/container

将宿主机上的 /path/on/host 文件或目录复制到容器 my_container 内的 /path/in/container。

从容器复制目录到宿主机

docker cp my_container:/path/in/container /path/on/host

将容器内的 /path/in/container 目录及其内容复制到宿主机的 /path/on/host。

从宿主机复制目录到容器

docker cp /path/on/host my_container:/path/in/container

将宿主机上的 /path/on/host 目录及其内容复制到容器 my_container 内的 /path/in/container。

环境配置

Python环境配置

从原生Linux开始配置Python环境

用了很多服务器,配过很多次环境了,但每次拿到个新的服务器还是会手生,不知道该从何下手配置环境,写下这部分内容记录一下安装过程,方便后续参考使用:

  1. 下载Anaconda安装包(优先推荐安装Miniconda,省时间,后面需要的包在安装时也能附加一起装上,所以一开始没必要安装那么多)https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 从这个链接里找需要的版本,不要直接下载,复制下载链接
  2. 打开终端,连接服务器,用wget 上面复制的链接下载安装包(.sh文件)
  3. 使用bash 上面下载的文件名进行安装,一路默认配置输入yes即可
  4. 这个时候可能还没法直接使用,有两种可能,一是环境变量没有加进去,二是加进去了但还没有更新,一般是没有更新,此时需要更新一下环境配置:source .bashrc,一般.bashrc文件放在根目录下
  5. 这时候命令行用户名前面会多一个(base),表示Anaconda已经正常安装好和可以使用,可以用python --version检查当前的python版本,加下来就可以愉快使用了
  6. 此时Conda使用的还是默认的下载Channel,有的包可能没有,而且下载速度奇慢,于是需要更换下载源,一般国内使用清华源或阿里源,复制下方指令执行:

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2

    但有时候conda也会遇到一些无法找到的包,还是需要用到pip来安装,所以也需要更新一下pip的源:

    python -m pip install --upgrade pip
    pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

Anaconda环境管理

注意:可以用conda来管理环境,但最好不要conda和pip安装包混用,否则在后面部署导出requirements.txt时会比较麻烦

创建环境:conda create --name <envname> <python version>

启用环境:conda activate <envname>,关闭环境:conda deactivate <envname>

列出当前所有的环境:conda info --envsconda env list

复制环境:conda create --name <envnameA> --clone <envnameB>(复制环境B,创建A)

移除环境:conda remove --name <envname> all

导出项目的依赖库列表:如果是用纯pip安装的环境,可以用pip freeze > requirements.txt导出相应的附属包信息,如果用conda安装了,就会包括很多虚拟路径。在混用的情况下,也可以使用pipreqs库来导出requirements.txt,这个库会自动分析代码,只生成实际依赖和使用了的包:pipreqs ./ --encoding=utf-8

UV

运行前可以通过env来查看当前环境变量,看是否有添加这两个环境变量

使用uv配置项目级环境时,常会遇到timeout的情况(下载响应时间过长,报错),需要定义环境变量来实现换源和修改timeout阈值时间

  1. 换源:export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
  2. 修改timeout时间:export UV_HTTP_TIMEOUT=100000

TO-DO: 找个一劳永逸的办法,永久添加环境变量进去

Jupyter notebook

远程访问Jupyter的密码设置

  1. 在控制端输入jupyter notebook password,回车,能够设置新密码,重复一遍确认
  2. 设置完新密码后,后台会生成jupyter_server_config.json文件(一般是在根目录下的.jupyter文件夹中),这个文件里包含了刚刚密码对应的hash值,打开这个文件,复制hashed_password中的值
  3. 打开jupyter_notebook_config.py,在没有更改任何设置的情况下里面全部是注释的内容,在最后一行加上c.NotebookApp.password='hashed_password',将hashed_password替换成刚才复制的值
  4. 重新打开jupyter,访问时如要求输入密码,则输入刚才新设置的那个密码即可正常访问