Linux学习心得(三)
source link: http://antkillerfarm.github.io/linux/2020/12/16/linux_study_3.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
大文件处理
在“大数据”时代,我们会经常遇到有大文本文件(上 GB 或更大)的情况。传统的文本编辑软件对处理这样的大文件不太有效,当我们试图打开一个大文件时会经常由于内存不足而郁闷的不行。
如果你只需要查看一个文本文件,并不对它做编辑,可以考虑下glogg。
sudo apt install glogg
如果需要修改的话,可以使用JOE。
sudo apt install joe
设置环境变量的方法:
1)临时的:使用export命令声明即可,变量在关闭shell时失效。示例如下:
export PATH=/home/xyz/bin:$PATH;
2)永久的:需要修改配置文件,变量永久生效。
在/etc/profile文件中添加变量(对所有用户生效)。修改文件后要想马上生效,还要运行source /etc/profile
,不然只能在下次重进此用户时生效。
在用户目录下的.bash_profile文件中增加变量(对该用户生效)。同样需要source才能马上生效。
重要的环境变量:
PATH:可执行文件路径。
LD_LIBRARY_PATH:动态链接库文件路径
minicom
1.查看串口设备
ls -l /dev
2.连接串口设备
minicom -D /dev/ttyS0
Ctrl+A Z
Ctrl+A X
MobaXterm
MobaXterm是一个远程终端登录软件。
http://mobaxterm.mobatek.net/
你是不是经常需要SSH或者telent远程登录到Linux服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp传输等等。
通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
这个问题的解决办法是安装一个会话管理工具。原先主要使用screen:
https://www.gnu.org/software/screen/
这是一个有30年历史(1987年)的软件。
现在的话,一般推荐使用tmux:
https://github.com/tmux/tmux/
sudo apt install tmux
https://linuxtoy.org/archives/from-screen-to-tmux.html
从screen切换到tmux
http://mingxinglai.com/cn/2012/09/tmux/
tmux的使用方法和个性化配置
http://chengjin.li/2017/08/09/tmux-using-tutorial/
终端复用工具—tmux的安装及使用
设置终端颜色
printf "\033[1;42mH\033[4;32;49me\033[5ml\033[7ml\033[0;32mo\033[0m\n"
https://zhuanlan.zhihu.com/p/81954911
如何改变你的终端颜色
http://easyos.net/articles/bsd/freebsd/output_control_in_freebsd_console
https://en-m.jinzhao.wiki/wiki/ANSI_escape_code
https://mp.weixin.qq.com/s/Q8RkA4cjko-sD5jn7NGzGw
一行命令堆出你的新垣结衣,不爆肝也能创作ASCII Art
设置随机的MAC地址
1.设置MAC地址
ifconfig eth0 hw ether 477265656e00
其中eth0是网口的名称,477265656e00是要设置的MAC地址(十六进制)。
2.生成随机数
随机数的生成在Linux中有多种方法,这里使用openssl。因为它和MAC都属于网络编程的范畴,同时使用的概率较大。
openssl rand -hex 6
3.SIOCSIFHWADDR: Cannot assign requested address错误
MAC地址的某些位有特定的含义,并不能随意设置。仍以477265656e00为例,第一个字节0x47的最后两位含义如下:
(00)统一管理的单播MAC
(01)统一管理的多播MAC
(10)本地管理的单播MAC
(11)本地管理的多播MAC
由于针对ADSL路由等这样的网络终端,一般使用的都是统一管理的单播MAC。
设置网卡eth0的IP地址和子网掩码
sudo ifconfig eth0 192.168.2.1 netmask 255.255.255.0
查看无线网卡状态:
iwconfig
wpa_cli
扫描周围的wifi信号:
iwlist scanning
wget和curl是最常见的下载工具。这里推荐使用axel,该工具支持多路http下载。
wget -c <URL>
curl -C -o <file name> <URL>
axel <URL>
wget -b -i XX.txt
-b
:后台,-i
:批量。
http://os.51cto.com/art/201605/511423.htm
Linux用户宝典:用于下载的十大命令行工具
mount -t nfs 192.168.0.1:/tmp /mnt/nfs
挂载NFS。挂载点(即上例中的/mnt/nfs)必须事先创建。
mount: /bak: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program
出现上面的问题,需要:
sudo apt install nfs-common libnfs-utils
sudo apt install nfs-server
cd /
sudo mkdir nfs-server
sudo chmod 777 nfs-server
sudo chmod 666 /etc/exports
echo "/nfs-server *(rw,sync,no_root_squash)">>/etc/exports
sudo service nfs-server restart
https://www.cnblogs.com/tu13/p/ubuntu_nfs.html
ubuntu18.04搭建NFS服务器
OpenGrok
OpenGrok是一个阅读源码的Web系统。
http://oracle.github.io/opengrok/
https://github.com/oracle/opengrok
http://mazhuang.org/2016/12/14/rtfsc-with-opengrok/
搭建大型源码阅读环境——使用OpenGrok
read-write lock、RCU lock、spin lock
对于悲观锁,开发者认为数据发送时发生并发冲突的概率很大,所以每次进行读操作前都会上锁。
对于乐观锁,开发者认为数据发送时发生并发冲突的概率不大,所以读操作前不上锁。
到了写操作时才会进行判断,数据在此期间是否被其他线程修改。如果发生修改,那就返回写入失败;如果没有被修改,那就执行修改操作,返回修改成功。
乐观锁一般采用Compare And Swap(CAS)算法进行实现。
比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。
RCU(Read-Copy Update)机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。
RCU适用于需要频繁的读取数据,而相应修改数据并不多的情景,例如在文件系统中,经常需要查找定位目录,而对目录的修改相对来说并不多,这就是RCU发挥作用的最佳场景。
ABA问题是指在CAS操作时,其他线程将变量值A改为了B,但是又被改回了A,等到本线程使用期望值A与当前变量进行比较时,发现变量A没有变,于是CAS就将A值进行了交换操作,但是实际上该值已经被其他线程改变过。
https://mp.weixin.qq.com/s/mTOzcdjaak-z6ypL9MR2Lw
小白科普:悲观锁和乐观锁
https://mp.weixin.qq.com/s/t-jZ9GoqW46rU3t9ahHqCQ
mysql悲观锁总结和实践
https://mp.weixin.qq.com/s/6MRi_UEcMybKn4YXi6qWng
操作系统中锁的实现原理
https://mp.weixin.qq.com/s/yHSraIAYsjYWPaGXA3PijA
一张图读懂非公平锁与公平锁
https://mp.weixin.qq.com/s/qnZL4ENAbTvVMVcImVTtYw
深入浅出CAS
https://mp.weixin.qq.com/s/g6TK1QiZgqPBDCE7gDJ3dA
面试必问的CAS原理你会了吗?
https://mp.weixin.qq.com/s/T_z2_gsYfs6A-XjVTVV_uQ
说说无锁(Lock-Free)编程那些事(上)
https://mp.weixin.qq.com/s/h75n7sHnrmoLJ4DVAW5AUQ
说说无锁(Lock-Free)编程那些事(下)
https://blog.csdn.net/zqz_zqz/article/details/70233767
java中的锁–偏向锁、轻量级锁、自旋锁、重量级锁
https://mp.weixin.qq.com/s/muSUJuE1A45UTXpWTeFxOA
24张图带你彻底理解Java中的21种锁
https://mp.weixin.qq.com/s/gbCshU5eEn4Gefduk1zdCQ
浅谈Java并发下的乐观锁
https://mp.weixin.qq.com/s/czLqzt0cRwPZeQ4WDaKiJQ
无锁队列的实现
https://mp.weixin.qq.com/s/rpufplXGYFo3P3mdIyY6vA
24张图带你彻底理解Java中的21种锁
https://www.cnblogs.com/linhaostudy/p/8463529.html
Linux RCU机制详解
https://zhuanlan.zhihu.com/p/67520807
Linux内核中的RCU
https://mp.weixin.qq.com/s/azy-lYHTtqdq2OrGwkfsmQ
图解多线程+1的最快操作
https://blog.csdn.net/qq_47768542/article/details/109117044
CAS原理分析及ABA问题详解
linux动态库使用soname来设定动态库的版本兼容性。
g++ -fPIC -shared -Wl,-soname,libbar.so.1 -o libbar.so.1.1.0
这个命令生成的动态库的名字为libbar.so.1.1.0
,soname为libbar.so.1
。
soname的意思是:形如libbar.so.1.x.y
的动态库,都可以兼容。
cmake写法:
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
https://www.jianshu.com/p/931a814083ce
Linux动态库soname的使用
https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Shared Libraries
position-independent code
不加-fPIC
编译的.so
必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码。
而多个进程引用同一个PIC动态库时,可以共用内存。这个库在不同进程中的虚拟地址不同,操作系统会把它们映射到同一块物理内存上。
cmake写法:
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
popen
popen()函数通过创建一个管道,调用fork产生一个子进程,执行一个shell以运行命令来开启一个进程。也就是说这个函数可以执行shell命令,而且还可以用fread或fgets来获取命令执行后的输出结果。
例子如下:
int8_t strcmd[256];
memset(strcmd, 0 , sizeof(strcmd));
sprintf(strcmd, "cat /etc/resolv.conf | awk '{printf $2}'");
pfile = popen(strcmd, "r");
if (pfile != NULL){
int8_t str[64];
bzero(str, sizeof(str));
fgets(str, sizeof(str), pfile);
pclose(pfile);
}
调整交换文件大小
fallocate -l 16G /swapfile
chmod 600 /swapfile
ls -lh /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
# Add this line to /etc/fstab to mount swap at boot
/swapfile swap swap defaults 0 0
swapoff /swapfile
keygen
cd ~/.ssh
ssh-keygen
cat ~/.ssh/id_rsa.pub
ssh-keygen
命令会生成两个文件id_rsa和id_rsa.pub,前者是私钥,后者是公钥,不要弄错了。
使用SSH有的时候会update失败。
解决办法:
修改~/.ssh/config,添加:
User XXX
https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key
Generating Your SSH Public Key
X Server
假设客户端的ip是1.1.1.1,而ssh服务器的ip是2.2.2.2。
Client:
xhost +2.2.2.2
ssh -X [email protected]
Server:
export DISPLAY=1.1.1.1:0.0
xclock
https://www.cnblogs.com/-9-8/p/5365105.html
ssh & display
https://mp.weixin.qq.com/s/u3VSyEtdcIgp8dCbwCaavA
SSH只能用于远程Linux主机?那说明你见识太小了!
tldr是一个采用示例说明的简化版的man。
http://tldr.sh/
该项目原生支持node.js,但也提供了其他多种语言的支持。
https://linuxtoy.org/archives/tldr.html
tldr: 简读Manpage
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK