The missing semester of your CS education--命令行环境

本文介绍了命令行环境中的任务控制,包括结束进程、暂停和后台执行,以及终端多路复用工具tmux的使用,如快捷键、配置和会话管理。此外,还涉及到了别名、配置文件(如Dotfiles)的管理和远程设备的SSH连接与配置,如SSH密钥、端口转发和文件复制。
摘要由CSDN通过智能技术生成

课程结构

01.课程概览与 shell
02.Shell 工具和脚本
03.编辑器 (Vim)
04.数据整理
05.命令行环境
06.版本控制(Git)
07.调试及性能分析
08.元编程
09.安全和密码学
10.大杂烩
11.提问&回答

本文档修改自这里,补充了一些视频中展示但配套文档中未提供的代码,以及一些注释。

命令行环境

本讲,我们将会学习

  • 如何同时执行多个不同的进程并追踪它们的状态、如何停止或暂停某个进程以及如何使进程在后台运行
  • 通过定义别名或基于配置文件来优化 shell 及其他工作的使用
    • 执行一些简单的命令,可在所有主机上使用相同的配置
  • 如何使用 ssh 操作远端机器

任务控制

结束进程


您的 shell 会使用 UNIX 提供的信号机制执行进程间通信。当一个进程接收到信号时,它会停止执行、处理该信号并基于信号传递的信息来改变其执行。就这一点而言,信号是一种 软件中断

kill -l
# 可以查看本系统支持的kill命令传送的信号

root用户可以使用所有的信号:

~$ sudo su
root@laihj:/home/laihj# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
Signum Signame Meaning
1 SIGHUP 使用SIGHUP信号终止一个程序;许多守护进程(daemon)会重载而非终止程序
2 SIGINT 快捷键 ctrl+c 使用SIGINT信号终止一个程序
3 SIGQUIT 快捷键 ctrl+\ 退出一个程序
9 SIGKILL 立即终止程序,不会有任何清理、关闭文件的操作,也不允许该信号被捕获
15 SIGTERM kill的默认参数,用来终止程序,支持简单的清理、关闭已打开的文件。该命令失效时,需要使用 sigkill 参数强制中断
19 SIGSTOP 暂停一个程序,接收到SIGCONT信号时,恢复程序
  • kill -1 <pid_id>kill -sighup <pid_id>kill -hup <pid_id>效果一样,pid_id为进程的编号

下面的程序展示了捕获SIGINT信号并忽略其功能:

#!/usr/bin/env python3
import signal, time

def handler(signum, time):
    print("\nI got a SIGINT, but I am not stopping")

signal.signal(signal.SIGINT, handler)
i = 0
while True:
    time.sleep(.1)
    print("\r{}".format(i), end="")
    i += 1
  • "\r": 将光标回退到本行开头,并进入替换模式
  • 例如,已经在shell终端打印出了1,之后,执行print(“\r2”)
    • 光标回退到打印出 1 的所在行的开头
    • 接着从光标处输出 2 ,逐字符替换本行原来的内容

如果我们向这个程序发送两次 SIGINT ,然后再发送一次 SIGQUIT,程序会有什么反应?注意 ^ 是我们在终端输入Ctrl 时的表示形式:

$ python3 sigint.py
24^C    # 键盘输入了Ctrl + C
I got a SIGINT, but I am not stopping
26^C   # 键盘输入了Ctrl + C     
I got a SIGINT, but I am not stopping
30^\[1]    39913 quit       python3 sigint.py   # 键盘输入了Ctrl + \

暂停和后台执行进程


信号可以让进程做其他的事情,而不仅仅是终止它们。

  • SIGSTOP 会让进程暂停。在终端中,键入 Ctrl-Z 会让 shell 发送 SIGTSTP 信号(即terminal版本的SIGSTOP)
  • jobs 命令会列出当前终端会话中尚未完成的全部任务
    • 可以使用 pid 引用这些任务(也可以用 pgrep 找出 pid:pgrep 命令名
    • 也可以使用 百分号 + job_idjobs 会打印任务编号)来选取该任务
      • 要选择最近的一个任务,可以使用 $! 这一特殊参数
      • kill %{ {job_id}}: 可以终止一个后台程序
  • fgbg 命令恢复暂停的工作。它们分别表示在前台继续或在后台继续。
  • 命令中的 & 后缀可以让命令在直接在后台运行,如sleep 1000 &
    • 此时还是会使用 shell 的标准输出(可以使用 shell 重定向处理)
  • 键入Ctrl-Z ,然后紧接着再输入bg,让已经在运行的进程转到后台运行
    • 后台的进程仍然是您的终端进程的子进程,一旦您关闭终端,会发送信号SIGHUP,终止这些后台的进程
    • 使用 nohup 来运行程序,可以忽略SIGHUP的作用
    • 针对已经运行的程序,可以使用disown,如disown sleep 2000 &

下面这个简单的会话中展示了一些概念的应用。

$ sleep 1000
^Z
[1]  + 18653 suspended  sleep 1000

$ nohup sleep 2000 &
# nohup {
   {path/to/script.sh}} & :Run a shell script that can live beyond the terminal:
[2] 18745
appending output to nohup.out

$ jobs
[1]  + suspended  sleep 1000
[2]  - running    nohup sleep 2000

$ bg %1
[1]  - 18653 continued  sleep 1000

$ jobs
[1]  - running    sleep 1000
[2]  + running    nohup sleep 2000

$ kill -STOP %1
[1]  + 18653 suspended (signal)  sleep 1000

$ jobs
[1]  + suspended (signal)  sleep 1000
[2]  - running    nohup sleep 2000

$ kill -SIGHUP %1
[1]  + 18653 hangup     sleep 1000

$ jobs
[2]  + running    nohup sleep 2000

$ kill -SIGHUP %2

$ jobs
# nohup会无视SIGHUP命令
[2]  + running    nohup sleep 2000

$ kill %2
[2]  + 18745 terminated  nohup sleep 2000

$ jobs

SIGKILL 是一个特殊的信号,它不能被进程捕获并且它会马上结束该进程。不过这样做会有一些副作用,例如留下孤儿进程。

您可以在 这里 或输入 man signal 或使用 kill -l 来获取更多关于信号的信息。

终端多路复用

当您在使用命令行时,您通常会希望同时执行多个任务。

终端多路复用器基于面板和标签可以分割出多个终端窗口,也可以分离当前终端会话并在将来重新连接。现在最流行的终端多路器是 tmuxtmux 是一个高度可定制的工具,您可以使用相关快捷键创建多个标签页并在它们间导航。

tmux快捷键


tmux 的快捷键需要我们掌握,它们都是类似 <C-b> x 这样的组合,即需要先按下前缀(prefix): Ctrl+b,松开后再按下 xtmux 中对象的继承结构如下:

  • 会话 - 每个会话都是一个独立的工作区,其中包含一个或多个窗口
命令 描述
tmux 开始一个新的会话
tmux new -s Session_name -n Window_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值