Nohup vs Setsid vs &
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。解决方法:
- 让进程忽略HUP(hangup)信号
- 让进程运行在新的会话里,从而成为不属于此终端的子进程
Nohup: no-hangup 就是让提交的命令忽略hangup信号
NAME
nohup - run a command immune to hangups, with output to a non-tty
SYNOPSIS
nohup COMMAND [ARG]...
nohup OPTION
DESCRIPTION
Run COMMAND, ignoring hangup signals.
nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename2>&1"
来更改缺省的重定向文件名。
nohup 实例:

setsid: setsid函数将创建新的会话,并使得调用setsid函数的进程成为新会话的领头进程。调用setsid函数的进程是新创建会话中的惟一的进程组,进程组ID为调用进程的进程号。
NAME
setsid - run a program in a new session
SYNOPSIS
setsid program [arg...]
DESCRIPTION
setsid runs a program in a new session.

注意上面的实例中我们的进程ID(PID)为43471 , 其父进程(PPID)为1 (也就是init进程ID),并不是当前终端的进程ID。
& : 可在结尾加上“&”来将命令同时放入后台运行。

以上进程仍然能够收到HUP信号.我们知道,将一个或多个命名包含在“( )”中就能让这些命令在子 shell 中运行中,我们将&放入( )内:

可见加上( )之后这些进程就会在新的会话中运行。
Linux查询CPU信息
lscpu
基本概念:
物理CPU数 - 主板上实际插入的CPU数量,可以数不重复的physical id 有几个(physical id)
CPU核数 - 单块CPU上面能处理数据的芯片组的数量,如双核、四核等(CPU cores)
逻辑CPU数 - 一般情况下,逻辑CPU数=物理CPU个数每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术(简单来说,它可使处理器中的1颗内核如2颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑CPU=物理CPU个数每颗核数*2)
它们之间的关系 - 总核数 = 物理CPU个数 * 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数
查看物理CPU的个数:
$ cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
查看逻辑CPU个数:
cat /proc/cpuinfo |grep "processor"|wc -l
查看CPU核数:
cat /proc/cpuinfo |grep "cores"|uniq
查看CPU型号信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
截取指定行之间的日志到新的文件中
sed -n '开始行数,结束行数p' 待截取的文件 >> 保存的新文件