![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 60
robch
Stay foolish Stay hungry!
展开
-
mac iterm2 快捷登录服务器
【代码】mac iterm2 快捷登录服务器。原创 2024-03-05 17:23:21 · 140 阅读 · 0 评论 -
GPG 使用指南:包括对称加密和非对称加密
加密与签名在传输信息时,会面临两个典型的问题:这两个问题不难理解。例如发送的邮件可能会被监听,诈骗分子可以冒充你老板。不一定是在网络上,在任何非面对面交流的情况下,都可能存在这两个问题。例如打仗时,情报可能被敌方监听窃取,收到的命令可能是被敌人冒充的。对于第一个问题,可以通过加密来解决。就像战争电影中,双方会加密自己的情报和破解对方的情报。那么如何进行加密呢?最容易想到的方法就是双方约定一套规则(加密算法),发送方将原始信息(明文)按照这套规则转换(加密)成别人看不懂的信息(密文)。其他人不知道这套规则,转载 2023-01-30 14:33:45 · 1020 阅读 · 0 评论 -
Base64 你真的理解吗 和 URL百分号
以上例详细解释:比如 bin 应该是一组,而 b 的 ASCII 码是 98 即0x62 或二进制 0110 0010 ,又根据上面说的分组方法,所以去 b 的前 6 个bit 即正好是二进制 0110 00 等于十进制的 24 就是 64 个字符数组中的第24个字符即大写的 Y......转载 2020-03-19 14:08:31 · 489 阅读 · 0 评论 -
浅谈select-epoll
综上:一次普通网络IO操作需要4次状态切换以及4次数据拷贝。以上只是操作系统底层流程,至于具体代码(欢迎去看linux源码)。我们编写的应用程序在进行IO的操作时,系统调用read() 和 write()。今天的话题还是得从最开始的IO开始。内核缓冲区和进程缓冲区(用户态缓冲区)。1.阻塞性IO(BIO,NIO).用户态和内核态切换。转载 2022-09-26 11:44:03 · 197 阅读 · 0 评论 -
select和epoll
之所以能够同时处理多个客户端的请求,原因是可以查询哪个客户端准备好了,对于准备好的客户端(例如客户端已经发了信息过来,本服务器用read读取数据的时候不会阻塞;另外,客户端已经关闭了连接,那么本服务read的时候,返回0,也不会阻塞),则和它进行通信,而未准备好的,就暂时先不理会。select是对加进去的所有fd进行轮询,返回之后也要对整个fd进行一次轮询,才能找到准备好的fd。epoll采用事件触发的方式,当某个fd准备好后会触发事件,这样减少了内核的轮询。现今用的多的是epoll。转载 2022-09-26 11:39:01 · 169 阅读 · 0 评论 -
4-Linux 进程组的精确理解和 Daemon进程
为了验证 if you log into a machine, your shell starts a session from: https://blog.csdn.net/cpxsxn/article/details/107371177。为了验证 os.setsid();executor.py 主体就是一个真正的 daemon 进程。shell 进程: http://c.biancheng.net/view/739.html。为了验证:父子进程是一个进程组,但是子进程不是进程组组长。原创 2022-09-23 12:07:29 · 484 阅读 · 0 评论 -
TCP 为什么是三次握手,而不是两次或四次?
tcp 三次握手,四次挥手, 为什么 A 要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态转载 2022-07-24 17:52:23 · 208 阅读 · 0 评论 -
深度理解同步异步和阻塞非阻塞
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。本文讨论的背景是Linux环境下的networ转载 2022-05-04 18:26:04 · 440 阅读 · 0 评论 -
为什么多线程可以利用到多核
对于这个基础知识,做个记录:首先还是复习下线程和进程的区别。 最主要的点就是:进程是资源分配的最小单位,线程是CPU调度的最小单位。(一个是相当于一个容器,一个是具体被CPU操作的) 进程间资源不共享,而多个线程是共享同个进程分配的资源的。 由于线程分用户线程和内核线程。内核线程再调用的时候可以去不同的核心去操作。所以多线程是可以利用到多核的。from: https://blog.51cto.com/jesnridy/2084498Java线程可以在运行在多个cpu核上吗?我转载 2020-05-13 16:58:37 · 5058 阅读 · 0 评论 -
git 仓库变更操作
Git global setup:git config --global user.name "robertcheng"git config --global user.email "robertcheng@xx.com"…或在命令行上创建一个新的存储库git clone https://coding.jd.com/stardb/aaa.gitcd aaatouch README.mdgit add README.mdgit commit -m "add README"git push原创 2021-12-28 11:41:07 · 484 阅读 · 0 评论 -
IPV6 TEST
客户端没有公网 IPV4 ,只有 vpc 内网和 ipv6;服务端有公网 IP 116.x.x.140 、 有 vpc 内网 和 ipv6现在在客户端执行 curl,客户端1:没有公网 IPV4 ,只有 vpc 内网和 ipv6;[root@dbs-ipv6-test ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.0.0.154 netmask 255.原创 2021-11-19 20:51:32 · 3353 阅读 · 0 评论 -
3-进程组和组长进程---很好的解释了一个session中怎么出现多个进程组的,是通过setpgid创建进程组的
进程组一个或多个进程的集合;可以接受同一终端的各种信号,同一信号发送进程组就等于发送给组中的所有进程;每个进程组有一个唯一的进程组ID;进程组的消亡要等到组中所有的进程结束;kill发送给进程组:kill -9 -进程组号(不要忘记负号)相关函数 #include <unistd.h> pid_t getpgrp(void);--老版 返回:调用进程的进程组ID; pid_t getpgid(pid_t pid);--新版 返回:进程pid所在进程转载 2021-11-12 19:05:40 · 224 阅读 · 0 评论 -
Linux网络收包总览
因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对Linux底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无从下手。我们今天用图解的方式,来深度理解一下在Linux下网络包的接收过程。还是按照惯例来借用一段最简单的代码开始思考。为了简单起见,我们用udp来举例,如下:int main(){int serverSocketFd = socket(AF_IN转载 2021-07-13 16:21:16 · 395 阅读 · 0 评论 -
Dockerfile制作镜像和启动容器和镜像导入导出和CentOS物理机运行Ubuntu
什么是 Dockerfile?Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。[root@jdddba docker_image_build]# [root@jdddba docker_image_build]# pwd/root/docker_image_build[root@jdddba docker_image_build]# [root@jdddba docker_image_build]# [root@jdddba docker_im原创 2021-06-25 16:19:17 · 694 阅读 · 0 评论 -
python的虚拟环境的本质,只要导出环境变量即可
python虚拟环境的本质echo "#!/bin/bashexport PATH=$target/bin:\$PATHexport LD_LIBRARY_PATH=$target/lib:\$LD_LIBRARY_PATH" > /tmp/setenv.shmkdir -p ~/.pip && touch ~/.pip/pip.confecho "[global]trusted-host = repos.jd.comindex-url = http://re原创 2021-02-25 20:08:14 · 213 阅读 · 0 评论 -
shell调用python脚本,并且向python脚本传递参数
1.shell调用python脚本,并且向python脚本传递参数shell中:#!/bin/shpython test.py $para1 $para2python的脚本test.py:import sysdef main($canshu1, $canshu2) .....main(sys.argv[1], sys.argv[2])2.使用shell调用python中的函数:python脚本如下 test.py:import ConfigParser co转载 2021-02-19 17:07:35 · 3005 阅读 · 0 评论 -
重学TCP/IP协议和三次握手四次挥手
文章目录 计算机网络体系结构网络协议是什么?为什么要对网络协议分层? TCP/IP 协议族应用层运输层网络层数据链路层物理层TCP/IP 协议族 TCP的三次握手四次挥手TCP报文的头部结构三次握手四次挥手 常见面试题为什么TCP连接的时候是3次?2次不可以吗?为什么TCP连接的时候是3次,关闭的时候却是4次?为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?如果已经建立了连接,但是客户端突然出现故障了怎......转载 2020-10-14 14:02:14 · 675 阅读 · 1 评论 -
MySQL的 performance_schema.threads 和操作系统的线程 ID
在和同事讨论 systemtap 的时候, 提到 performance_schema 里的 threads 表,只要 client 连接上 server之后,在该 session 里面执行的所有 SQL 都有共同的线程 ID:mysql> select processlist_id,thread_os_id from performance_schema.threads where processlist_info like 'select process%';+----------------原创 2020-09-15 21:53:08 · 1521 阅读 · 0 评论 -
Pyhon 线程里获取操作系统层面的进程 ID 和 线程 ID,太棒了
python的多线程坑坑不断… …python的threading因为封装的太好, 很多本源的东西在threading对象里是拿不到的. 首先需要说明的是 python threading的name跟ident,这些看起来是线程名字,线程id其实只是个标识,注意是标识而已. 简单过了下threading创建对象及启动线程的代码,发现ident跟pstree查到的线程id是两码事. 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新http://xiaorui.cc/?p=3转载 2020-09-10 11:01:48 · 1523 阅读 · 0 评论 -
Go MPG 模型之详解
MPG 模型概述Golang 中的 MPG 线程模型对两级线程模型进行一定程度的改进,使它能够更加灵活地进行线程之间的调度。它由三个主要模块构成,如下图所示:machine,一个 machine 对应一个内核线程,相当于内核线程在 Golang 进程中的映射processor,一个 prcessor 表示执行 Go 代码片段的所必需的上下文环境,可以理解为用户代码逻辑的处理器goroutine,是对 Golang 中代码片段的封装,其实是一种轻量级的用户线程。为了减轻描述工作,下面的介绍中转载 2020-09-06 20:50:47 · 1675 阅读 · 5 评论 -
Go MPG 模型之铺垫-常见的线程模型
今天我们来了解一下 Go 语言的协程并发机制,这也可能是 Go 语言最为吸引人的特性了,了解它的原理和底层机制对于掌握 Go 语言大有裨益,话不多说开始吧!并发和并行并发和并行都是为了充分利用 CPU 多核计算资源所提出来的概念,相信我们或多或少都对二者的概念有所了解:并发指的是在同一时间段内,多条指令在 CPU 上同时执行;并行指的是在同一时刻内,多条指令在 CPU 上同时执行。并发程序并不要求 CPU 具备多核计算的能力。在同一时间段内,多个线程会被分配一定的执行时间片,在 CPU 上被快转载 2020-09-06 20:25:51 · 219 阅读 · 0 评论 -
signal(SIGCLD,SIG_IGN)
遇到信号量的问题?signal(SIGCLD,SIG_IGN)SIGCHLD的语义为:子进程状态改变后产生此信号,父进程需要调用一个wait函数以确定发生了什么。对于SIGCLD的早期处理方式如下:如果进程特地设置该信号的配置为SIG_IGN,则调用进程的子进程将不产生僵死进程。如果将SIGCLD的配置设置为捕捉,则内核立即检查是否有子进程准备好被等待,如果是这样,则调用SIGCLD处理程序。APUE上SIGCLD语义写的有点不清楚,到底我们的系统是如何来处理SIGCLD信号呢?1.SIG_DF转载 2020-08-19 17:11:43 · 994 阅读 · 0 评论 -
并发和并行的区别
并发同一时间有两个需求,需求A和B分配到了你的手上,而且这两个需求都很急,你为这两个需求分别开了两个分支A和B,一会儿需求A催你改代码,你切到了A的分支,一会儿B催你改代码,你又切到了需求B,你是一个人但是你具有处理并发事件的能力,在两个需求之间来回穿梭。并行同一事件有两个需求,同样也很急,但是这个时候你不是一个人在战斗了,你有了新同事;需求A分配给了你,需求B分配了你的新同事,那么你就不用再去关心需求B做了什么,两个人分别处理各自在自己的分支上做需求。最后引用深入理解计算机系统CSAPP的回答并原创 2020-07-16 14:48:18 · 128 阅读 · 0 评论 -
2-怎么编写一个标准的 daemon 进程_Adv
一、概述Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行转载 2020-07-15 21:54:17 · 454 阅读 · 1 评论 -
解决 wait() 带来的阻塞可以用两次 fork
为什么有时候有些代码会调用两次fork呢?(1)调用一次fork的作用:第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。(2)第二次fork的作用:虽然当前关闭原创 2020-07-15 21:09:06 · 981 阅读 · 0 评论 -
curl -u 背后的内容以及和 Django rest framework 的 BasicAuthentication 的呼应
curl -u 的基本介绍curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。-u参数用来设置服务器认证的用户名和密码。$ curl -u 'bob:12345' https://google.com/login上面命令设置用户名为 bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym原创 2020-06-27 20:43:13 · 5511 阅读 · 1 评论 -
ssh 本地和远程转发和动态转发
第一部分 概述当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我们带来什么好处吧!端口转发概述让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一原创 2020-06-19 21:13:47 · 837 阅读 · 0 评论 -
C/C++ 动态库与静态库的制作和使用
静态库的用法静态库的文件名 libxxx.a做静态库的命令:ar rcs libxxx.a file1.o file2.o file.o使用静态库:gcc main.c -L lib/ -lxxx注意:-L的作用是告诉gcc你的libxxx.a放在了哪个目录里;-l的作用是告诉gcc使用哪个静态库。举个例子,目录结果如下:├── include│ └── head.h├── lib│ ├── main.c└── src ├── add.c ├── mul原创 2020-05-22 17:39:47 · 502 阅读 · 2 评论 -
GCC编程四个过程:预处理-编译-汇编-链接
在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序。一、GCC快速入门Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out我们来看一下经典入门程序"Hello World!"hello.c#include <stdlib.h>#include <stdio.h>void main(void){ printf("hello world!\原创 2020-05-22 16:49:28 · 1988 阅读 · 0 评论 -
协程 和 线程、函数调用的本质区别
协程和函数调用有什么区别:函数调用是顺序执行的,如果调用2次,每次 sleep 10 秒,则总共休息20秒;如果用协程,调用2次,每次休息 10秒,则总共 10 秒就完成了。所有的协程分享进程的时间片,每个时间点只能有一个协程在执行代码。如果正在执行的某个协程发生 IO 阻塞,则会把其换出,从而去执行其他协程。相当于说“利用IO 阻塞等待的时间去执行其他就绪的协程。# -*- codin...原创 2020-04-29 16:18:07 · 1713 阅读 · 2 评论 -
shell 切换用户执行命令
有时候在自动化部署的时候,我们可能需要远程在目标服务器执行一些命令。有可能会涉及到切换用户的操作,可以适用 EOF 来实现#!/bin/bashsudo su - <<EOFtouch /tmp/whotestEOF远程执行一些命令和切换用户执行命令和脚本:ssh 10.240.34.165 'ls /tmp';ssh 10.240.34.165 'sudo mv...原创 2020-04-23 11:14:16 · 2746 阅读 · 0 评论 -
1-怎么编写一个标准的 Daemon进程_Base
参考: https://segmentfault.com/a/1190000009082089https://segmentfault.com/a/1190000009152815nohup是咋回事呢?nohup干了这么几件事: 将stdin重定向到/dev/null,于是程序读标准输入将会返回EOF 将stdout和stderr重定向到nohup.out或者用户通过参数指定的文...原创 2019-10-12 10:47:41 · 241 阅读 · 0 评论 -
TTY 背后的秘密
参考: https://segmentfault.com/a/1190000009082089原创 2019-10-11 21:44:17 · 96 阅读 · 0 评论 -
妙用 ps cmd
常用的 ps -ef , ps -ajx (这可以显示出进程组 ID帮助理解 Daemon 进程和 setsid 非常有帮助)man ps:SIMPLE PROCESS SELECTION a Lift the BSD-style "only yourself" restriction, which is imposed upon the set of all pro...原创 2019-10-11 20:28:13 · 564 阅读 · 0 评论 -
shell cmd misc
tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射。我们看到,当我们输入完cat >out原创 2019-09-26 15:40:35 · 1259 阅读 · 1 评论 -
crontab 的用法
怎么快速创建 cron job 任务执行 crontab -e 命令,然后就像编辑普通文件一样,编辑计划任务即可[root@hc-25-68-14 tmp]# crontab -e*/2 * * * * sed -i ‘$a hello’ /tmp/hello保存退出可以看到[root@hc-25-68-14 ~]# crontab -ecrontab: installing n...原创 2019-08-06 11:26:24 · 716 阅读 · 2 评论 -
logroate 的用法
[root@hc-25-68-14 ~]# cat /etc/cron.daily/logrotate #!/bin/sh/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1EXITVALUE=$?if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logro...原创 2019-08-07 15:14:17 · 260 阅读 · 0 评论