笔记¶
Wake Up Process
Linux 多进程的竞争休眠机制
基本是基于Linux的时间片轮转机制。A process/thread is woken up by inserting it in the queue of processes/threads to be scheduled.
内核调度算法
CFS(Completely Fair Scheduler)是一种用于 Linux 操作系统的调度算法,它旨在实现对 CPU 时间的公平分配。CFS 是 Linux 内核中默认的调度器,自 Linux 2.6.23 版本以来就成为了标准调度器。
CFS 调度算法的主要目标是确保各个任务在相同的时间片内能够获得公平的CPU时间,不会因为优先级等因素而造成资源争夺不均。以下是 CFS 调度算法的一些关键特点和原则:
-
虚拟化时钟: CFS 使用了一种称为虚拟化时钟(virtual runtime)的概念,而不是传统的时间片。每个任务都有一个虚拟运行时间,调度器根据虚拟运行时间来决定哪个任务应该被调度。
-
权重: CFS 引入了权重的概念,用于调整不同任务的相对优先级。较高权重的任务会在相同时间间隔内获得更多的虚拟运行时间,从而实现按比例分配CPU资源。
-
累积虚拟运行时间: 调度器会根据每个任务的权重和已累积的虚拟运行时间,计算出每个任务的应有的虚拟运行时间片。任务在使用完它的时间片后,会根据虚拟运行时间进行重新排队。
-
红黑树结构: CFS 使用红黑树来管理任务队列,这种数据结构使得在插入、删除和搜索任务时的时间复杂度保持在对数级别。
除了 CFS,Linux 内核还有其他调度算法,如:
-
实时调度器(Real-Time Scheduler): 用于实时任务,提供硬实时和软实时的调度策略,确保实时任务在指定的时间内执行完成。
-
O(1) 调度器(O(1) Scheduler): 是 Linux 2.4 内核中使用的调度器,它的时间复杂度为常数级别。然而,随着多核系统的出现,O(1) 调度器在多核环境下的性能表现受到限制,因此被 CFS 替代。
这些调度算法在不同的场景和需求下,对于多任务操作系统的调度提供了不同的方法和策略。选择适合的调度算法可以根据系统的应用和性能要求来进行。
问题
在高强度竞争之后,有些进程陷入长期sleep,并且在核空闲的时候,也不再重新运行?为什么?
原因可能是程序逻辑阻塞了,或者在等待IO
查看进程Sleep的原因
首先 计算机对一个进程是如何判断sleep的,是某时间内的计算占比低于某个阈值吗?
htop s 可以查看kernel 是不是阻塞, l 可以查看是不是读写同一个文件导致阻塞了。
Sleep的瓶颈在哪里
sleep for what, waiting for what?
实践1 strace
strace -p PID 可以显示一些信息
$ strace -p 4005042
wait4(-1, # 等待任意子进程结束
# check subprocess
$ pstree -p 4005042
pinbin(4005042)---BC_Compute(4005082)-+-{BC_Compute}(4005187)
|-{BC_Compute}(4005188)
|-{BC_Compute}(4005252)
|-{BC_Compute}(4005296)
|-{BC_Compute}(4005299)
`-{BC_Compute}(4005302)
$ strace -p 4005082
strace: Process 4005082 attached
futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL
# futex - fast user-space locking(seems to be used in OpenMP)
# It is typically used as a blocking construct in the context of shared-memory synchronization.
$ strace -p 4005188
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0 # repeat
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe536dbc0) = 0
It seems this is a subprocess repeating sleep leading to all other process to wait in the synchronization.
Use gdb -p PID to attach the process to locate the infinite loop (need Debug Symbols).
futex解释
futex 是 Linux 下的一个系统调用,用于实现用户空间线程间的同步和通信。让我们逐个解释这个系统调用中的每个参数的含义:
0x7fffe52de1b8: 这是一个指向内存地址的指针(或称为地址),通常是用于表示需要同步的资源或变量的地址。在这里,它表示需要等待的共享资源或变量的地址。FUTEX_WAIT: 这是一个指定 futex 要执行的操作的标志。FUTEX_WAIT表示线程正在等待 futex 的值发生变化,即等待条件满足。当某个线程执行FUTEX_WAIT操作时,如果 futex 的值与预期不符,则该线程将被置于休眠状态,直到 futex 的值发生变化或超时。2: 这是一个表示期望的 futex 值的参数。当调用FUTEX_WAIT时,线程将检查 futex 的当前值是否等于此参数指定的值。如果不等于,则线程将休眠等待。NULL: 这是一个指向 timespec 结构的指针,用于设置超时。这里为NULL表示调用没有设置超时,即线程将一直等待,直到 futex 的值发生变化。
总的来说,futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL) 表示线程正在等待位于内存地址 0x7fffe52de1b8 的 futex 变量的值等于 2。如果 futex 的值不是 2,则线程将一直等待直到 futex 的值变为 2 或者超时。这样的同步机制在多线程编程中用于等待条件满足后再执行某些操作,从而避免资源竞争和提高程序的并发性能。
nanosleep解释
这是一个系统调用 nanosleep 的输出,通常用于让线程休眠一段时间。让我们逐个解释这个系统调用的含义:
-
nanosleep: 这是 Linux 下的一个系统调用,用于使线程休眠一段指定的时间。 -
{tv_sec=0, tv_nsec=2000000}: 这是传递给nanosleep的第一个参数,是一个指向timespec结构的指针。timespec结构用于表示时间间隔,包括秒(tv_sec)和纳秒(tv_nsec)。
在这里,tv_sec=0 表示秒数为 0,tv_nsec=2000000 表示纳秒数为 2000000。因此,这个 nanosleep 调用将会使线程休眠 2 毫秒(1 秒 = 1000000000 纳秒,所以 2000000 纳秒就是 2 毫秒)。
-
0x7fffe5368bc0: 这是传递给nanosleep的第二个参数,表示一个timespec结构的指针。这个参数用于存放未休眠完成的剩余时间,如果nanosleep被中断(例如收到信号),它将在这个指针中返回剩余的时间。在这个输出中,剩余时间被存储在内存地址0x7fffe5368bc0处。 -
= 0: 这是nanosleep的返回值,表示成功完成。返回值为 0 表示nanosleep成功休眠了指定的时间。
综上所述,这个输出表示线程成功休眠了 2 毫秒。
实践2: zsim模拟程序
程序直接执行正常,zsim模拟直接sleep?
$ strace -p 303359
read(10,
$ pstree -p 303359 │
gups_vanilla(303359)-+-gups_vanilla(303449)-+-orted+ │
| `-{gups+ │
|-{gups_vanilla}(303360) │
|-{gups_vanilla}(303361)
$ pstree -p 303449 │
gups_vanilla(303449)-+-orted(303451)-+-{orted}(303452) │
| |-{orted}(303642) │
| |-{orted}(303643) │
| `-{orted}(303644) │
`-{gups_vanilla}(303450)
这是一个 Open MPI(Message Passing Interface)的启动命令,用于启动一个 MPI 程序,并配置一些运行时参数。让我们逐个解释这个命令中的每个选项和参数的含义:
orted --hnp --set-sid --report-uri 11 --singleton-died-pipe 12 -mca state_novm_select 1 -mca ess hnp -mca pmix ^s1,s2,cray,isolated
部分参数含义如下:
orted: 这是 Open MPI 的一个工具,用于启动和管理 MPI 进程。-mca state_novm_select 1: 这是一个 MCA(Modular Component Architecture)选项,用于指定某个模块或组件的参数设置。在这里,state_novm_select设置为 1,可能是指定某个组件或模块在运行时的选项。-mca pmix ^s1,s2,cray,isolated: 这是另一个 MCA 选项,用于配置 PMIx(Process Management Interface for Exascale)的相关设置。^s1,s2,cray,isolated表示排除 s1、s2、cray 和 isolated 这些模块,可能是禁用某些特定的组件或功能。
| pid | strace output | explanation |
|---|---|---|
| 303451 | restart_syscall(<... resuming interrupted read ...> | |
| 303452 | futex(0xabba001ec8, FUTEX_WAIT, 2, NULL | |
| 303642 | epoll_wait(18, ... | epoll_wait 系统调用,用于等待文件描述符18上的事件 |
| 303643 | select(50, [48 49], NULL, NULL, | 如下 |
| 303644 | select(53, [51 52], NULL, NULL, |
restart_syscall表示系统调用被中断后重新启动的过程。它通常出现在系统调用的执行过程中,当某个信号(例如 SIGSTOP 或 SIGCONT)中断了系统调用的执行,然后系统调用在信号处理完成后被重新启动。- select 是一个用于在多个文件描述符上进行 I/O 多路复用(I/O multiplexing)的系统调用,它可以监视多个文件描述符,并在其中任何一个文件描述符准备好进行 I/O 操作时返回。
- select 调用的输出,它将监视文件描述符 48 和 49,并在其中任何一个文件描述符准备好读取数据或超时(2 秒后)时返回。
- 完全无法理解呢! 可能需要深入了解MPI的实现栈细节才能明白。
命令行唤醒Sleep进程
The only way to “wake it up” is to arrange for the condition to be met. 用户是无法更改的状态的。
传统kill进程
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Overview of Compute system
“Those who cannot remember the past are condemned to repeat it.” —George Santayana, 1905
"Our technology,our machines,is part of our humanity.We created them to extend ourself,and that is what is unique about human beings. - Ray Kurzweil
Script: Email notifications when machine is free
outline
login to free SMTP server(qq, google) to send email to others.
send email using command line
- check
ping mail.ustc.edu.cn - MUST : set gmail open to support SMTP and apppassword
- or config qq email
IMAP, POP3 or SMTP
mailutils
According to ref1.
send but the same, more crazy thing is the -v and -d flag is not supported. and --debug-level=trace0 isn't recognized. many same question in StackOverflow
sudo tail -n 30 /var/log/mail.log or mail.error show more info.
ssmtp
We try ref2 ssmtp, sudo vim /etc/ssmtp/ssmtp.conf
TLS_CA_FILE=/etc/pki/tls/certs/ca-bundle.crt
root=shaojieemail@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com
AuthUser=shaojieemail
AuthPass={apppassword}
FromLineOverride=YES
UseSTARTTLS=Yes
UseTLS=YES
hostname=snode6
The config get work but not well configed, e.g., TLS_CA_FILE
sending a email using gmail took about 13 mins.
$ ssmtp 943648187@qq.com < mail.txt
......
[->] Received: by snode6 (sSMTP sendmail emulation); Wed, 06 Sep 2023 15:42:05 +0800
[->] From: "Shaojie Tan" <shaojiemike@gmail.com>
[->] Date: Wed, 06 Sep 2023 15:42:05 +0800
[->] test server email sending
[->]
[->] .
[<-] 250 2.0.0 OK 1693986323 5-20020a17090a1a4500b0026b4ca7f62csm11149314pjl.39 - gsmtp
[->] QUIT
[<-] 221 2.0.0 closing connection 5-20020a17090a1a4500b0026b4ca7f62csm11149314pjl.39 - gsmtp
sendmail
$ sendmail 94364818s7@qq.com < mail.txt
sendmail: Authorization failed (535 5.7.8 https://support.google.com/mail/?p=BadCredentials e7-20020a170902b78700b001c0c79b386esm8725297pls.95 - gsmtp)
get to work after well config gmail setting.
Speed Compare
| command | snode6 time(mins) | icarus1 |
|---|---|---|
| 4 | 1s | |
| ssmtp | 13 | |
| sendmail | 6 |
send email by python
ref using QQ apppassword and python.
email notifications
- Create a Bash Script: Create a Bash script that checks the CPU usage and sends an email if it's below 30%. For example, create a file named
cpu_check.sh:
#!/bin/bash
# Get CPU usage percentage
cpu_usage=$(top -b -n 1 | grep '%Cpu(s):' | awk '{print $2}' | cut -d'.' -f1)
echo "cpu_usage : ${cpu_usage} on $(hostname)"
# Check if CPU usage is below 30%
if [ "$cpu_usage" -lt 30 ]; then
echo "beyond threshold : ${cpu_usage} on "
# Send an email
echo "CPU usage is ${cpu_usage} below 30% on $(hostname)" | mail -s "Low CPU Usage Alert on $(hostname)" your_email@example.com
fi
Make the script executable:
Modify your_email@example.com with your actual email address.
- Schedule the Script: Use the
cronscheduler to run the script at regular intervals. Edit your crontab by running:
Add an entry to run the script, for example, every 5 minutes:
*/5 * * * * /staff/shaojiemike/test/cpu_check.sh >> /staff/shaojiemike/test/cpu_check.log
# Run every 15 minutes during working hours (9 am to 7 pm)
*/15 9-19 * * * /path/to/your/script.sh
Replace /path/to/cpu_check.sh with the actual path to your Bash script.
- Save and Exit: Save the crontab file and exit the text editor.
Now, the script will run every 5 minutes (adjust the cron schedule as needed) and send an email notification if the CPU usage is below 50%. You should receive an email when the condition is met.
Please note that this is a basic example, and you can modify the script to include more details or customize the notification further as needed. Additionally, ensure that your server is configured to send emails; you may need to configure SMTP settings for the mail or sendmail command to work correctly.
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Conda
conda
Anaconda和Miniconda都是针对数据科学和机器学习领域的Python发行版本,它们包含了许多常用的数据科学包和工具,使得安装和管理这些包变得更加简单。
解决了几个痛点:
- 不同python环境的切换(类似VirtualEnv)
- 高效的包管理工具(类似pip,特别是在Windows上好用)
anaconda
Anaconda是一个全功能的Python发行版本,由Anaconda, Inc.(前称Continuum Analytics)提供。
- 它包含了Python解释器以及大量常用的数据科学、机器学习和科学计算的第三方库和工具,如NumPy、Pandas、Matplotlib、SciPy等。
- Anaconda还包含一个名为Conda的包管理器,用于安装、更新和管理这些库及其依赖项。
- Anaconda发行版通常较大(500MB),因为它预装了许多常用的包,适用于不希望从头开始搭建环境的用户。
Miniconda
Miniconda是Anaconda的轻量级版本(50MB),它也由Anaconda, Inc.提供。
- 与Anaconda不同,Miniconda只包含了Python解释器和Conda包管理器,没有预装任何其他包。这意味着用户可以根据自己的需求手动选择要安装的包,从而实现一个精简而高度定制化的Python环境。
- 对于希望从零开始构建数据科学环境或需要更细粒度控制的用户,Miniconda是一个很好的选择。
Install miniconda
According to the official website,
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# choose local path to install, maybe ~/.local
# init = yes, will auto modified the .zshrc to add the miniconda to PATH
# If you'd prefer that conda's base environment not be activated on startup,
# set the auto_activate_base parameter to false:
conda config --set auto_activate_base false
you need to close all terminal(all windows in one section including all split windows), and reopen a terminal will take effect;
Python on windows1
换源
超时报错:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
面对如下报错
> conda create -n opensora-t00906153 python=3.8 -y
Channels:
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): failed
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
Elapsed: -
An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
If your current network has https://repo.anaconda.com blocked, please file
a support request with your network engineering team.
'https//repo.anaconda.com/pkgs/main/linux-64'
修改~/.condarc
ssl_verify: true
show_channel_urls: true
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- conda-forge
如果还是有超时错误,多半是下载多了被拦截
通过 curl -v http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 检查是不是请求被阻拦了。
可以换成科大源或者default 源。
创建与激活
# 激活环境(base),路径为指定的 conda 安装路径下的 `bin/activate` 文件
source /home/m00876805/anaconda3/bin/activate
# 或者 conda init zsh
# 使用以下命令创建一个名为"myenv"的虚拟环境(您可以将"myenv"替换为您喜欢的环境名称):
conda create --name myenv python=3.8
# list existed env
conda env list
/home/m00876805/anaconda3/bin/conda env list
# 查看具体环境的详细信息
conda env export --name <env_name>
# 激活,退出
conda activate name
conda deactivate name
conda pack
- 目的:
conda pack用于将现有的 Conda 环境打包成一个压缩文件(如.tar.gz),便于在其他系统上分发和安装。 - 打包内容: 打包的内容包括环境中的所有依赖、库和包(定制修改包),通常用于在不使用 Anaconda 或 Miniconda 的系统上还原环境。
- 恢复方式: 打包后的环境可以解压缩到指定位置,之后运行
conda-unpack来修复路径,使其在新环境中正常工作。
打包
conda-pack 可以将 Conda 环境打包成一个 .tar.gz 文件,以便于跨机器或系统移动和还原环境。以下是使用 conda-pack 打包和还原环境的步骤:
1. 打包环境
假设要打包的环境名为 my_env:
这会在当前目录生成一个 my_env.tar.gz 文件。你可以将这个文件复制到其他系统或机器上解压还原。
2. 还原环境
在一个特定的 conda 环境目录(例如 /home/anaconda3)下还原和激活打包的环境,可以按以下步骤操作:
假设场景
- 目标
conda激活路径:/home/anaconda3/bin/activate - 打包文件:
my_env.tar.gz - 解压后的环境名称:
my_env
步骤
- 解压文件到
conda环境目录
首先,将打包文件解压到指定的 conda 环境目录下的 envs 目录:
mkdir -p /home/anaconda3/envs/my_env
tar -xzf my_env.tar.gz -C /home/anaconda3/envs/my_env --strip-components 1
这里的 --strip-components 1 会去掉 tar.gz 包中的顶层目录结构,使内容直接解压到 my_env 文件夹内。
- 激活并修复环境
激活该环境,并运行 conda-unpack 来修复路径:
现在,my_env 环境已在 /home/anaconda3 目录下的 envs 文件夹中完成还原,可以正常使用。
conda env export
- 目的:
conda env export > freeze.yml用于导出当前 Conda 环境的配置,包括所有安装的包和它们的版本信息,以 YAML 格式保存。 - 导出内容: 导出的内容主要是依赖项和版本号,而不包括包的实际二进制文件。适用于在相同或不同系统上重建环境。
- 恢复方式: 使用
conda env create -f freeze.yml可以根据导出的 YAML 文件创建一个新环境。
conda list -e > requirements.txt 和 conda env export > freeze.yml
conda list -e > requirements.txt 和 conda env export > freeze.yml 都是用于记录和管理 Conda 环境中安装的包,但它们之间有一些关键的区别:
conda list -e
- 用途: 这个命令生成一个以简单文本格式列出当前环境中所有包及其版本的文件(
requirements.txt)。 - 内容: 列出的内容通常仅包括包的名称和版本,而不包含环境的依赖关系、渠道等信息。
- 安装方式: 通过
conda install --yes --file requirements.txt可以尝试使用 Conda 安装这些列出的包。这种方式适合简单的包管理,但可能在处理复杂依赖时存在问题。
conda env export
- 用途: 这个命令生成一个 YAML 文件(
freeze.yml),它包含了当前环境的完整配置,包括所有包、版本、渠道等信息。 - 内容: 导出的 YAML 文件包含了完整的依赖关系树,可以确保在重建环境时完全匹配原始环境的状态。
- 安装方式: 通过
conda env create -f freeze.yml可以根据 YAML 文件创建一个新的环境,确保与原环境一致。
关系与总结
- 复杂性:
conda env export更加全面和可靠,适合重建相同的环境;而conda list -e更简单,适合快速记录包。 - 使用场景: 对于需要准确重建环境的情况,使用
freeze.yml是更好的选择;而对于简单的包列表管理,requirements.txt可能足够用。
因此,如果你的目标是确保环境的一致性,使用 conda env export 和 freeze.yml 是推荐的做法;如果只是想快速记录并安装一组包,requirements.txt 是一个方便的选择。
安装
在conda命令无效时使用pip命令来代替
while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt
The double pipe (“||”) is a control operator that represents the logical OR operation. It is used to execute a command or series of commands only if the previous command or pipeline has failed or has returned a non-zero status code.
复制已有环境(fork)
conda create -n 新环境名称 --clone 原环境名称 --copy
虽然是完全复制,但是pip install -e安装的包会因为源文件的改动而失效
pip install -e 是用于在开发模式下安装 Python 包的命令,允许你在不复制包文件的情况下,将项目源代码直接安装到 Python 环境中,并保持源代码与环境中的包同步更新。这对于开发过程中频繁修改和测试代码非常有用。
以下是 pip install -e 的使用方法:pip install -e /path/to/project
详细解释:
- /path/to/project:项目的根目录,通常包含 setup.py 文件。setup.py 文件定义了包的名称、依赖、入口点等信息。
- -e 选项:表示“可编辑安装”(editable),意味着它不会复制项目文件到 Python 环境的 site-packages 目录,而是创建一个符号链接,指向原始项目路径。这样你可以在原路径下修改源代码,Python 环境中的包会实时反映这些修改。
通过 pip freeze 命令更好地查看
- 通过
pip freeze命令更好地查看:
如果你想明确区分哪些包是通过 pip install -e 安装的,可以使用 pip freeze 命令。与 pip list 不同,pip freeze 会将包的版本和安装源显示出来。对于 -e(editable mode)安装的包,pip freeze 会有特殊标记。
运行以下命令:
输出示例:
在这里,带有 -e 标记的行表示这个包是通过 pip install -e 安装的,后面跟的是包的源代码路径(例如 Git 仓库 URL 或本地路径),而不是直接列出包的版本号。
-
输出解析:
-
-e标记:表示这个包是以开发模式安装的。 - 普通包:对于直接通过
pip install安装的包(不是开发模式),它们会以包名==版本号的形式列出。 gitURL 或本地路径:开发模式下安装的包会指向源代码的路径,通常是git仓库 URL 或本地路径(如果是通过本地文件系统安装的)。
参考文献
Linux Terminal
导言
对程序员来说,一个好用、易用的terminal,就是和军人手上有把顺手的好枪一样。
基础知识
用户的环境变量和配置文件
在Linux系统中,用户的环境变量和配置文件可以在不同的节点生效。以下是这些文件的功能和它们生效的时机:
-
/etc/environment:- 功能: 设置系统范围的环境变量。
- 生效时机: 在用户登录时读取,但不会执行shell命令。它主要用于设置变量,如PATH、LANG等。
-
/etc/profile:- 功能: 为系统的每个用户设置环境信息。
- 生效时机: 当用户登录时,会读取并执行该文件中的配置。它是针对登录shell(例如,通过终端登录或ssh登录)的。
-
/etc/profile.d/:- 功能: 存放多个脚本,这些脚本会被
/etc/profile读取和执行。 - 生效时机: 与
/etc/profile相同,登录shell时执行。它使得系统管理员可以将不同的配置分散到多个文件中管理。
- 功能: 存放多个脚本,这些脚本会被
-
/etc/bash.bashrc:- 功能: 为所有用户设置bash shell的配置。
- 生效时机: 对于非登录shell(例如,打开一个新的终端窗口)时会读取并执行。
-
~/.profile:- 功能: 为单个用户设置环境信息。
- 生效时机: 用户登录时读取并执行,主要针对登录shell。
-
~/.bashrc:- 功能: 为单个用户配置bash shell的设置。
- 生效时机: 用户打开一个新的bash shell(非登录shell)时读取并执行。
总结:
/etc/environment和/etc/profile主要用于系统范围的环境变量设置,前者不会执行shell命令,后者会执行。/etc/profile.d/中的脚本作为/etc/profile的扩展,用于更灵活的管理配置。/etc/bash.bashrc适用于所有用户的bash配置,但只针对非登录shell。~/.profile和~/.bashrc适用于单个用户,前者用于登录shell,后者用于非登录shell。
通过这些文件,系统和用户可以灵活地设置和管理环境变量和shell配置,以满足不同的需求和使用场景。
\n \r 回车 换行
| 符号 | ASCII码 | 意义 |
|---|---|---|
| \n | 10 | 换行NL: 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed |
| \r | 13 | 回车CR: 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return |
在不同的操作系统这几个字符表现不同:
- 在WIN系统下,这两个字符就是表现的本义,
- 在UNIX类系统,换行\n就表现为光标下一行并回到行首,
- 在MAC上,\r就表现为回到本行开头并往下一行,至于ENTER键的定义是与操作系统有关的。通常用的Enter是两个加起来。
终端命令行代理
在任意层级的SHELL配置文件里添加
写成bashrc的脚本命令
#YJH proxy
export proxy_addr=localhost
export proxy_http_port=7890
export proxy_socks_port=7890
function set_proxy() {
export http_proxy=http://$proxy_addr:$proxy_http_port #如果使用git 不行,这两个http和https改成socks5就行
export https_proxy=http://$proxy_addr:$proxy_http_port
export all_proxy=socks5://$proxy_addr:$proxy_socks_port
export no_proxy=127.0.0.1,.huawei.com,localhost,local,.local
}
function unset_proxy() {
unset http_proxy
unset https_proxy
unset all_proxy
}
function test_proxy() {
curl -v -x http://$proxy_addr:$proxy_http_port https://www.google.com | egrep 'HTTP/(2|1.1) 200'
# socks5h://$proxy_addr:$proxy_socks_port
}
# set_proxy # 如果要登陆时默认启用代理则取消注释这句
常用命令
check process create time
kill all process by name
常见问题
鼠标滚轮输出乱码
滚轮乱码,是tmux set mouse on的原因
进入tmux后退出,并运行reset即可
sudo后找不到命令
当你使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。
添加所需要的路径(如 /usr/local/bin)到/etc/sudoers文件"secure_path"下
在用python使用curses写多进程进度条的时候,混乱输出

解决办法如下:
参考文献
Zsim-tlb: bug
bug
zsim-tlb simulate in icarus0
pinbin: build/opt/zsim.cpp:816: LEVEL_BASE::VOID VdsoCallPoint(LEVEL_VM::THREADID): Assertion `vdsoPatchData[tid].level' failed.
Pin app terminated abnormally due to signal 6.
locate error
VOID VdsoCallPoint(THREADID tid) {
//level=0,invalid
assert(vdsoPatchData[tid].level);
vdsoPatchData[tid].level++;
// info("vDSO internal callpoint, now level %d", vdsoPatchData[tid].level); //common
}
vDSO(virtual dynamic shared object) is a kernel machanism for exporting a carefully set kernel space routines (eg. not secret api,gettid()andgettimeofday()) to user spapce to eliminate the performance penalty of user-kernel mode switch according to wiki.vDSO- You can use some
__vdso_getcpu()C library, and kernel will auto move it to user-space vDSOovercomevsyscall(first linux-kernel machanism to accelerate syscall) drawback.- In zsim,
vDSOhave only four functionenum VdsoFunc {VF_CLOCK_GETTIME, VF_GETTIMEOFDAY, VF_TIME, VF_GETCPU};
vDSO simulate part
// Instrumentation function, called for EVERY instruction
VOID VdsoInstrument(INS ins) {
ADDRINT insAddr = INS_Address(ins); //get ins addr
if (unlikely(insAddr >= vdsoStart && insAddr < vdsoEnd)) {
//INS is vdso syscall
if (vdsoEntryMap.find(insAddr) != vdsoEntryMap.end()) {
VdsoFunc func = vdsoEntryMap[insAddr];
//call VdsoEntryPoint function
//argv are: tid ,func(IARG_UINT32),arg0(LEVEL_BASE::REG_RDI),arg1(LEVEL_BASE::REG_RSI)
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR) VdsoEntryPoint, IARG_THREAD_ID, IARG_UINT32, (uint32_t)func, IARG_REG_VALUE, LEVEL_BASE::REG_RDI, IARG_REG_VALUE, LEVEL_BASE::REG_RSI, IARG_END);
} else if (INS_IsCall(ins)) { //call instruction
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR) VdsoCallPoint, IARG_THREAD_ID, IARG_END);
} else if (INS_IsRet(ins)) { //Ret instruction
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR) VdsoRetPoint, IARG_THREAD_ID, IARG_REG_REFERENCE, LEVEL_BASE::REG_RAX /* return val */, IARG_END);
}
}
//Warn on the first vsyscall code translation
if (unlikely(insAddr >= vsyscallStart && insAddr < vsyscallEnd && !vsyscallWarned)) {
warn("Instrumenting vsyscall page code --- this process executes vsyscalls, which zsim does not virtualize!");
vsyscallWarned = true;
}
}
INS_Address is from pin-kit, but INS_InsertCall is pin api.
try:
.level is just show the level of nested vsyscall. I think comment the assert which trigerd when callfunc before entryfunc is just fun.
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Diary 230827: 上海二次元之旅
缘由
华为实习要结束了,作为二次元,在中国秋叶原怎么能不好好逛逛呢?
目标
- 百联zx,外文书店,
- 百米香榭
- 迪美地下城(香港名街关门装修了
- 第一百货和新世界
- 大丸百货的4F的华漫潮玩
- 静安大悦城的间谍过家家的快闪点。
- 徐家汇的一楼jump店、龙猫店,二楼GSC店
- mihoyo总部
爱上海
上海真是包容性极强的地方。原本内心对二次元的热爱,竟然这么多人也喜欢。不必隐藏,时刻伪装。可以暂时放松自我的感觉真好。
论对二次元人物的喜爱
爱的定义
爱或者热爱是最浓烈的情感。对象一般是可以交互的人物,物体说不定也可以。但是至少要能与他持续产生美好的回忆和点滴,来支持这份情感。
比如说,我一直想让自己能热爱我的工作,就需要创造小的阶段成功和胜利来支持自己走下去。
区分喜爱与贪恋美色
- 首先和对方待在一起很舒服,很喜欢陪伴的感觉,想长期走下去。
- 其实不是满脑子瑟瑟的想法
- 外表美肯定是加分项,但是更关注气质,想法和精神层面的东西。
三次元与二次元人物
三次元的人物包括偶像歌手,和演员。需要演出,演唱会来与粉丝共创回忆,演员也需要影视剧作品。
二次元人物大多数来自于动画,因为游戏一般不以刻画人物为目的,比如主机游戏 当然galgame和二次元手游除外。
日本动画以远超欧美和国创的题材和人物的细腻刻画(不愧是galgame大国,Band Dream it’s my go到人物心里描写简直一绝)创造了许多令人喜爱的角色。
比较优势
- 表现能力的上限来看,动画也是远超游戏(不然游戏里为什么要动画CG)和真人影视剧的。
- 二次元人物的二次创作的低门槛(无论从还原难度还是法律约束上来说,毕竟三次元人物经常和真人强绑定)和舆论高包容性(传统二次元社区可比饭圈干净多了)都有远超三次元的优势。
- 此外二创Cosplay的平易近人或者说触手可及的真实感。二创能创造出远超原本作品的人物记忆和羁绊
- 另一点可能的是二创的低门槛带来的创作快乐,这一点在之前分析音乐的快乐有提到。二创主要有音乐,mmd,
iwara动画 - cos 可以让原本平凡的人生,染上对应角色不平凡经历的色彩
- 最后一点就是永恒性吧,第一点是之前我分析过人们喜欢在变化的生活中追求不变,或者相反。三次元人物或者演员会老去,但是二次元人物能在一部新剧场版下重现活力
- 另一点就是不会被背叛。
比较缺点
- 对于二次元角色的喜爱在时间的长河里是单向的,除开代入主角,很难收获二次元角色对自己的喜爱(这样看galgame稍微弥补了这点)。交流交互隔着次元的屏障。
- 成长可塑性的略微欠缺:如果作品已经完结了,除开少量二创,角色形象基本就确定了。除非输入到AI里训练,使之生命延续。
- 惊喜性缺失: 真实人物是多面的,不可控的。但是二次元角色的反转特性只存在于剧集的剧情里。
初步结论
女朋友 > 喜欢二次元(连载 > 完结) >> 追星
图片轰炸
23.08.27 to do
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
UnimportantView: Anime Recommendation
起源与目标
- 看番没有形成自己的喜好,导致看到不对的,反而有副作用,
- 什么番可以成为精神支柱,而不是看了之后。反而精神内耗更严重了。(看了happy sugar life后,直接抑郁了)
说明
不同于恋爱番,催泪番,这样的分类。其实我更在意作品想表达的主题,作者想展现给读者什么。 无论是各种道理,还是就是某个环境,虚幻世界。
绊
羁绊:对人的爱,爱情、亲情、友情。
何为爱的寻爱之旅
| 番剧名 | 精神内核 | 评语 | 喜爱的角色 | 音乐 |
|---|---|---|---|---|
| Happy Sugar Life | 守护你是我的爱语 | 难以理解的爱的世界里,两位迷途少女相遇,救赎,领悟爱的蜜罐生活 | 砂糖、盐 | 金丝雀、ED、悲伤小提琴 |
我推的孩子(第一集)
Violet Garden
羁绊的破碎和重组
BanG Dream It's my go !!!!! 初羁绊(友情,百合,重女)的破碎和reunion
病名为爱
未来日记
家有女友、渣愿
点滴恋爱
百合类的成长:终将成为你,
我心危
轮回宿命类
跨越时空也无法阻止我爱你
命运石之门
RE0
无法抵达的简单幸福未来
寒蝉鸣泣之时
魔法少女小圆
史诗类
复杂、紧张的鸿篇巨制。多非单一的精神内核可以概括。多为群像剧。
奇幻、幻想世界史诗
Fate Zero
钢炼
EVA
to do
刀剑
四谎
CLANND
龙与虎
巨人
超炮
凉宫
鲁鲁修
轻音
补番列表
- 物语系列
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无