Command-line Environment

Command-line Environment

常用信号

  • SIGTERM: 终止信号,通常用于请求进程正常退出。
  • SIGINT: 中断信号,通常由用户按下Ctrl+C产生,用于中断正在运行的进程。
  • SIGKILL: 杀死信号,强制终止进程,无法被进程捕获或忽略。
  • SIGSTOP: 停止信号,暂停进程的执行。
  • SIGCONT: 继续信号,继续被暂停的进程。
  • SIGALRM: 闹钟信号,用于实现定时器功能。
  • SIGCHLD: 子进程状态改变信号,当子进程终止或停止时,父进程会收到该信号。
  • SIGUSR1,SIGUSR2: 用户自定义信号,可以用来实现进程之间的通信。
  • Ctrl+C (SIGINT): 这是最常用的信号,当你在终端中运行一个程序时,按下Ctrl+C,就会向该程序发送SIGINT信号,通常会终止程序的运行。
  • Ctrl+Z (SIGTSTP): 这个信号会将当前的前台进程挂起,你可以使用命令fg将挂起的进程恢复到前台,或者使用bg将挂起的进程放到后台运行。
  • Ctrl+\ (SIGQUIT): 这个信号除了终止程序外,还会生成一个core dump文件,这个文件可以用来调试程序。

nohup

用于在终端窗口关闭后继续运行命令。
nohup command &

  • nohup: 告诉系统在终端窗口关闭后继续运行命令。
  • command: 要执行的命令。
  • &: 将命令放到后台运行。

jobs

  • -l 或 –list: 以长格式显示作业信息,包括作业编号、进程 ID、命令行等。
  • -p 或 –pids: 只显示作业的进程 ID。
  • -r 或 –running: 只显示正在运行的作业。
  • -s 或 –stopped: 只显示已停止的作业。
    可以使用百分号 + 任务编号(jobs 会打印任务编号)来选取该任务。如果要选择最近的一个任务,可以使用 $! 这一特殊参数。

与 jobs 命令配合使用的命令

  • fg: 将后台作业调回前台继续运行。
  • bg: 将一个停止的作业放到后台继续运行。
  • kill [signal] jobspec:其中signal如果不指定,默认发送 SIGTERM-l可以查看可发送的信号列表。

pgrep

  • -a: 显示进程的命令行。
  • -f: 根据完整的命令行进行匹配。
  • -l: 显示进程名。
  • -u: 根据用户 ID 匹配。
  • -g: 根据进程组 ID 匹配。
  • -P: 根据父进程 ID 匹配。
  • -t: 根据终端名匹配。
  • -x: 精确匹配进程名。
  • -i: 忽略大小写。
  • -v: 反向匹配,即查找不匹配的进程。

disown

用于将后台运行的作业从当前 shell 的作业列表中删除。这意味着,即使你关闭了终端窗口,这些作业仍然会继续运行。
disown [-r] jobspec

  • jobspec:指定要删除的作业。可以使用作业号(如 %1)、作业名(如 myjob)或进程 ID(PID)。
  • -r:删除所有后台作业。

tmux

tmux 的核心概念

  • 会话 (session): 一个独立的工作环境,可以包含多个窗口。
  • 窗口 (window): 会话中的一个视图,可以包含多个窗格。
  • 窗格 (pane): 窗口中的一个子区域,用于显示不同的命令行。

常用操作

  • 会话 - 每个会话都是一个独立的工作区,其中包含一个或多个窗口

    • tmux 开始一个新的会话
    • tmux new -s NAME 以指定名称开始一个新的会话
    • tmux ls 列出当前所有会话
    • 在 tmux 中输入 <C-b> d ,将当前会话分离
    • tmux a 重新连接最后一个会话。您也可以通过 -t 来指定具体的会话
  • 窗口 - 相当于编辑器或是浏览器中的标签页,从视觉上将一个会话分割为多个部分

    • <C-b> c 创建一个新的窗口,使用 <C-d> 关闭
    • <C-b> N 跳转到第 N 个窗口,注意每个窗口都是有编号的
    • <C-b> p 切换到前一个窗口
    • <C-b> n 切换到下一个窗口
    • <C-b> , 重命名当前窗口
    • <C-b> w 列出当前所有窗口
  • 面板 - 像 vim 中的分屏一样,面板使我们可以在一个屏幕里显示多个 shell

    • <C-b> " 水平分割
    • <C-b> % 垂直分割
    • <C-b> <方向> 切换到指定方向的面板,<方向> 指的是键盘上的方向键
    • <C-b> z 切换当前面板的缩放
    • <C-b> [ 开始往回卷动屏幕。您可以按下空格键来开始选择,回车键复制选中的部分
    • <C-b> <空格> 在不同的面板排布间切换

alias

用于创建命令别名。
例如:alias ll='ls -la'注意等号左右都没有空格。
unalias 别名删除别名 alias查看所有别名
为了使自定义的别名在每次打开终端时都生效,可以将它们写入 shell 的配置文件中。

  • Bash: ~/.bashrc
  • Zsh: ~/.zshrc

配置文件dotfiles

这些文件通常隐藏在你的用户目录下,用来存储各种应用程序和操作系统的个性化设置。
实际上,很多程序都要求您在 shell 的配置文件中包含一行类似 export PATH="$PATH:/path/to/program/bin" 的命令,这样才能确保这些程序能够被 shell 找到。

ssh

ssh-keygen

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

  • -t rsa:指定使用 RSA 算法。
  • -b 4096:密钥长度为 4096 位,保证更高的安全性。
  • -C "your_email@example.com":注释,用于标识这个密钥,一般填写你的邮箱地址。
    Enter file in which to save the key (/home/your_user/.ssh/id_rsa):
    这里保持默认按enter。
    1
    2
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again:
    ls -al ~/.ssh查看密钥文件
    cat ~/.ssh/id_rsa.pub
    将该公钥粘贴到你想要连接的远程服务器或服务上。通常是粘贴到 ~/.ssh/authorized_keys 文件或在服务中配置 SSH 公钥。

ssh-copy-id

用于将本地主机的公钥复制到远程主机的 authorized_keys 文件中的命令行工具。允许使用 SSH 密钥进行无密码登录。
ssh-copy-id [options] user@host
选项:

  • -i identity_file: 指定要使用的私钥文件(默认为 ~/.ssh/id_rsa)。
  • -f authorized_keys_file: 指定远程主机的 authorized_keys 文件(默认为 ~/.ssh/authorized_keys)。
  • -K: 将公钥添加到远程主机的 known_hosts 文件中。
  • -R: 从远程主机的 authorized_keys 文件中删除公钥。

scp

  • -r:递归复制整个目录。
  • -p:保留文件属性(权限、时间戳等)。
  • -v:显示详细的传输过程。
  • -q:静默模式,不显示输出。
  • -i identity_file:指定使用的私钥文件。

rsync

rsync [options] source destination
常用选项

  • -a:归档模式,保留文件属性(权限、时间戳等)。
  • -v:详细模式,显示传输过程。
  • -z:压缩传输数据,提高效率。
  • -r:递归同步整个目录。
  • -u:更新模式,仅传输更新的文件。
  • -t:保留文件修改时间。
  • -p:保留文件权限。
  • -P:保留文件所有者和组。
  • –progress:显示传输进度。
  • –delete:删除目标中不存在的源文件。

课后练习

1、答:

1
2
3
sleep 10000 &
pgrep -af sleep
pkill -f sleep

2、kill 命令成功退出时其状态码为 0 ,其他状态则是非 0。kill -0 则不会发送信号,但是会在进程不存在时返回一个不为 0 的状态码。
答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash



# 定义 pidwait 函数

pidwait() {

local pid=$1 # 获取进程的 PID
# 将标准暑促和标准错误输出丢弃,不输出在终端

while ps -p "$pid" > /dev/null 2>&1; do # 使用 ps 检查进程是否存在,只要 `ps` 命令的返回值为 0(表示进程存在),就一直循环。

sleep 1 # 每秒轮询一次,减少 CPU 占用

done

echo "Process $pid has finished."

}



# 将函数导出到当前 shell 会话中

export -f pidwait

echo "pidwait function loaded into the current session."

然后在当前目录下运行该脚本,并确保它在当前shell会话中定义了pidwait函数source filename.sh。然后再执行pidwait <pid>即可。


Command-line Environment
https://blakehansen130.github.io/2024/10/22/Command-line Environment/
发布于
2024年10月22日
许可协议