命令行环境
Linux Shell:后端开发必备
1. 命令与环境变量
清空目录
find /path/to/dir -mindepth 1 -delete
执行前检查:
find /path/to/dir -mindepth 1
命令替换与进程替换
$(command) # 把命令输出替换成文本
<(command) # 把命令输出伪装成文件
示例:
today=$(date +%F)
diff <(ls src) <(ls docs)
环境变量
NAME=value # 当前 Shell 变量
export NAME=value # 子进程也能继承
NAME=value command # 仅本次命令有效
unset NAME # 删除变量
printenv # 查看环境变量
示例:
TZ=Asia/Tokyo date
只让本次 date 使用东京时区,不修改当前 Shell。
2. 进程、作业与信号
进程和作业
- 进程:操作系统概念,用 PID 标识。
- 作业:Shell 管理的一条命令或一组管道,用
%1、%2标识。 - 一个作业可能包含多个进程。
ps aux # 查看进程
pgrep nginx # 查 PID
jobs # 查看当前 Shell 作业
前后台控制
command & # 后台启动
Ctrl-Z # 暂停前台作业
bg %1 # 后台继续
fg %1 # 调回前台
echo "$!" # 最近后台进程 PID
后台运行并保存日志:
python app.py > app.log 2>&1 &
常用信号
Ctrl-C SIGINT 中断前台程序
Ctrl-Z SIGTSTP 暂停程序
kill PID SIGTERM 请求正常退出
kill -9 PID SIGKILL 强制终止
应先用:
kill PID
无效时再用:
kill -9 PID
SIGKILL 无法被捕获,程序不能清理资源;只杀父进程时,子进程可能继续运行,成为孤儿进程。
查看信号:
kill -l
man signal
3. 长期任务与脚本清理
nohup
适合无需交互、关闭终端后继续运行的任务:
nohup python app.py > app.log 2>&1 &
查看日志:
tail -f app.log
tmux
适合长期任务和 SSH 场景,可重新进入原终端:
tmux new -s NAME
tmux ls
tmux attach -t NAME
离开会话:
Ctrl-B,然后按 D
选择原则:
只需后台运行:nohup
需要重新进入终端:tmux
正式部署:systemd、Docker、Kubernetes
trap
用于脚本退出时清理资源:
#!/usr/bin/env bash
cleanup() {
rm -f /tmp/mytemp.*
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
SIGINT 或 SIGTERM 触发退出,随后由 EXIT 执行清理;SIGKILL 无法触发 trap。
远程机器
生成一对密钥,可以运行 ssh-keygen。
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/id_ed25519
服务器端,ssh 查看 .ssh/authorized_keys 来决定允许哪些客户端登录。要把公钥复制过去:
cat .ssh/id_ed25519.pub | ssh alice@remote 'cat >> ~/.ssh/authorized_keys'
# 或者更简单一点(如果系统提供了 ssh-copy-id)
ssh-copy-id -i .ssh/id_ed25519 alice@remote
本地和服务器之间传输文件
scp:直接复制文件
scp path/to/local_file remote_host:path/to/remote_file
冒号 : 很关键,它表示后面是远程路径
复制整个目录需要 -r,即 recursive(递归):
scp -r ./my-project aliyun-jasper0507:/home/jasper0507/
scp 的特点是简单直接,但重复上传目录时,往往会重新传输全部内容。
rsync:只同步发生变化的内容
rsync -av --partial ./large-file aliyun-jasper0507:/home/jasper0507/
rsync 会比较本地和远程文件,通常只传输新增或变化的部分,而不会每次重传整个项目。
参数:
-a archive,递归同步,并尽量保留权限、时间、符号链接等信息
-v verbose,显示同步过程
--partial 表示传输中断后保留未完成的临时数据,下一次可以减少重复传输。
临时传一两个小文件:scp 反复同步项目或大量文件:rsync
需要注意目录后的 /:
rsync-av ./my-project/ server:~/app/
表示同步 my-project 里面的内容。
rsync-av ./my-project server:~/app/
表示把 my-project 这个目录本身复制到 app 下。