Zsh 개발 가이드 (제1 5 편 프로 세 스 및 작업 제어)

4679 단어 zshshelllinux
독 서 를 지도하 다
일반적인 경우 zsh 스 크 립 트 는 하나의 프로 세 스 (그리고 단일 스 레 드) 에서 실 행 됩 니 다. 그러나 가끔 은 코드 를 병행 해 야 합 니 다. 현재 CPU 는 기본적으로 다 핵 이기 때문에 운행 속 도 를 가속 화 할 수 있 습 니 다.이것 은 프로 세 스 와 작업 제어 에 관련된다.여 기 는 프로 세 스 의 개념 을 말 하지 않 는 다.
하위 프로 세 스에 서 코드 실행
앞에서 말 했 듯 이 소괄호 의 코드 는 하위 프로 세 스에 서 실 행 됩 니 다.
% (sleep 1000 && echo good)

# 然后再另一个 zsh 里查看进程
% pstree | grep sleep
     `-tmux: server-+-zsh---zsh---sleep

안에 두 개의 zsh 프로 세 스 가 있 습 니 다.작은 괄호 를 넣 지 않 으 면:
% sleep 1000 && echo good

# 然后再另一个 zsh 里查看进程
% pstree | grep sleep
     `-tmux: server-+-zsh---sleep

zsh 프로 세 스 가 하나 밖 에 없습니다.이것 은 작은 괄호 를 사용 할 때, 안의 코드 가 하위 프로 세 스 (새로운 zsh 프로 세 스) 에서 실행 되 었 다 는 것 을 설명 한다.그러나 주의해 야 할 것 은 괄호 안에 명령 (예 를 들 어 sleep 1000) 이 하나 밖 에 없다 면 더 이상 하위 프로 세 스 를 열 어 실행 하지 않 을 것 입 니 다.
그렇다면 하위 프로 세 스에 서 코드 를 실행 하 는 것 은 어떤 의미 가 있 습 니까?위 처럼 프론트 데스크 를 놓 고 운행 한다 면 의미 가 없다.하지만 우 리 는 그것 을 백 스테이지 에 놓 고 운행 할 수 있다.
백그라운드 에서 프로 세 스 실행
우선 하나의 프로그램 을 배경 으로 어떻게 실행 하 는 지 살 펴 보 자.
% sleep 1000 &
[1] 850

sleep 1000 뒤에 & 를 추가 하면 배경 에 놓 고 실행 합 니 다.그 다음 에 한 줄 의 내용 을 출력 합 니 다. [1] 은 프로 세 스 의 작업 (job) 번호 이 고 850 은 프로 세 스 번호 (PID) 입 니 다.우 리 는 다른 명령 을 계속 실행 할 수 있 습 니 다. sleep 가 끝 날 때 까지 기다 릴 필요 가 없습니다.
jobs 명령 은 현재 배경 에서 실행 중인 모든 작업 을 볼 수 있 습 니 다:
% jobs
[1]  + running    sleep 1000

# -l 会输出进程号
% jobs -l
[1]  + 850 running    sleep 1000

fg 명령 은 배경 작업 을 프론트 로 전환 할 수 있 습 니 다.
# 然后会继续等待 sleep 运行
% fg
[1]  + running    sleep 1000

프로 세 스 가 실행 되 었 다 면 배경 에 다시 놓 고 싶 습 니 다. 이렇게 할 수 있 습 니 다.
# 回车后按 ctrl + z
% sleep 1000
^Z
zsh: suspended  sleep 1000
# 这时可以运行 jobs 看一下,sleep 是处于挂起状态的
% jobs
[1]  + suspended  sleep 1000
# 可以用 bg 让 sleep 恢复运行
% bg
[1]  + continued  sleep 1000
# 这样 sleep 就运行在后台了
% jobs
[1]  + running    sleep 1000

사실 jobs, fg, bg 이 명령 들 은 자주 사용 되 지 않 습 니 다. 대충 용법 을 알 면 됩 니 다.예 를 들 어 현재 vim 으로 파일 을 편집 하고 있 습 니 다. 파일 은 저장 되 지 않 았 지만 터미널 에서 명령 을 실행 한 다음 에 vim 으로 돌아 가 고 싶 습 니 다.ctrl + z 를 누 르 면 vim 을 끊 고 명령 을 실행 할 수 있 습 니 다. 마지막 으로 fg 를 실행 하여 vim 를 회복 할 수 있 습 니 다.그러나 보통 우 리 는 여러 개의 터미널 시 뮬 레이 터 를 시작 하거나 새 터미널 시 뮬 레이 터 라벨 을 열거 나 tmux 를 사용 할 수 있 습 니 다. 셸 에서 이렇게 소란 을 피 울 필요 가 없습니다.
스 크 립 트 에서 배경 프로 세 스 실행 코드 사용 하기
그러면 이전 장면 에 대답 하려 면 백 스테이지 프로 세 스에 서 sleep 1000 & echo good 를 실행 해 야 합 니 다.
% {sleep 1000 && echo aa} &

이렇게 큰 괄호 안의 코드 는 백 엔 드 프로 세 스에 서 실 행 됩 니 다. 스 크 립 트 에 서 는 다른 것 을 계속 쓸 수 있 습 니 다.만약 다 한 후에 대괄호 안의 코드 가 실 행 될 때 까지 기 다 려 야 한다.
#!/bin/zsh

{sleep 5 && echo p1} &
# $! 是上一个运行的后台进程的进程号
pid=$!
{sleep 10 && echo p2} &
echo aaa
# 要做的其他事情先做完
sleep 2
echo bbb
# wait 加进程号用来等待进程结束,类似 fg,但脚本中不能用 fg
wait $pid
echo ccc

결과:
% ./test.zsh
aaa
bbb
p1
ccc
# p2 是脚本运行完过几秒才输出的
% p2

이렇게 하면 우 리 는 여러 프로 세 스 를 동시에 조작 하여 자신 을 위해 서 비 스 를 할 수 있다.프로 세 스 간 통신 은 이름 파이프 나 일반 파일 로 도 할 수 있 으 며, socket 파일 (Zsh 에 zsh/net/socket 모듈 이 있 습 니 다. socket 파일 로 통신 할 수 있 습 니 다. 파 이 프 는 단 방향 이 고, socket 은 양 방향 이 며, 좀 더 유연 합 니 다. 나중에 사용 방법 을 알 아 보 겠 습 니 다) 또는 네트워크 통신 을 사용 합 니 다.(스 크 립 트 가 다른 기계 에 분포 되 어 있 으 면 zsh 에 zsh/net/tcp 모듈 이 있 습 니 다. 외부 명령 없 이 tcp 통신 을 할 수 있 고 나중에 도 말씀 드 리 겠 습 니 다)
시그 널
실행 중인 프로 세 스 는 신 호 를 받 고 신호 에 응답 할 수 있 습 니 다. kill 명령 은 프로 세 스에 신 호 를 보 내 는 데 사 용 됩 니 다.
15 (SIGTERM) 은 가장 많이 사용 되 는 신호 이 며, kill 에서 파 라 메 터 를 추가 하지 않 는 기본 신호 입 니 다. kill num 은 프로 세 스 번 호 를 num 프로 세 스 로 종료 할 수 있 습 니 다. 그러나 15 신 호 는 프로 세 스 에 포착 되 어 종료 되 지 않 습 니 다. 프로 세 스 를 강제로 죽 이려 면 9 신호 (SIGKILL) 를 사용 할 수 있 습 니 다.프로 세 스 가 캡 처 할 수 없 지만 프로 세 스 가 하고 있 는 일이 갑자기 중단 되 고 심각 한 영향 을 미 칠 수 있 으 므 로 9 신호 로 프로 세 스 를 죽 이지 마 십시오.
스 크 립 트 에서 신호 캡 처:
#!/bin/zsh

# SIGINT 是 2 信号,ctrl + c 会触发
TRAPINT() {
    # 处理一些退出前的善后工作
    sleep 333
}

sleep 1000

그리고 이 스 크 립 트 를 실행 한 다음 ctrl + c, 스 크 립 트 가 종료 되 지 않 았 습 니 다. sleep 333 을 실행 하고 있 기 때문에 한 번 더 눌 러 야 종료 합 니 다.
스 크 립 트 에서 신 호 를 사용 합 니 다. 보통 다른 프로 세 스에 보 내 는 것 이지 자신 에 게 보 내 는 것 이 아 닙 니 다. 스 크 립 트 에서 도 신호 처리 가 필요 하지 않 습 니 다. 신호 와 관련 된 더 많은 내용 은 나중에 보충 할 수 있 습 니 다.
총결산
본 고 는 프로 세 스 와 작업 제어 에 관 한 내용 을 대충 설명 하 였 으 며, 주로 스 크 립 트 에서 다 중 프로 세 스 실행 코드 를 사용 하 는 데 사 용 됩 니 다. 터미널 에서 작업 제 어 를 하 는 것 이 아 닙 니 다. 스 크 립 트 의 여러 프로 세 스 가 어떻게 협조 하 는 지 에 대한 내용 은 계속 보완 되 어야 합 니 다.
본 고 는 더 이상 업데이트 되 지 않 습 니 다. 전체 시 리 즈 는 여기 서 유지 보 수 를 업데이트 합 니 다. github.com/goreliu/zshguide
유 료 로 Windows, Linux, Shell, C, C++, AHK, Python, JavaScript, Lua 등 분야 관련 문 제 를 해결 하고 유연 하 게 가격 을 책 정 합 니 다. 상담 을 환영 합 니 다. 위 챗 ly 50247.

좋은 웹페이지 즐겨찾기