note

內部指令與外部指令

[user@localhost ~]$ a=5; echo $a
5
[user@localhost ~]$ (a=10; echo $a)
10
[user@localhost ~]$ echo $a
5

上面會顯示這樣的結果是因為Linux的bash在接收到外部命令(ELF 64-bit LSB executable)時,通常會fork()出一個子行程,然後使用exec()切換到自行程去執行命令。而內部命令(POSIX shell script)像是cd,就不會使用fork(),而是會執行在bash行程裡面執行。一般使用echo是外部指令,但是使用()包起來後,echo就變成內部指令了,會fork()出一個行程,執行完就丟掉了,所以最後echo $a才會顯示5\

Linux特殊符號

符號 含意 範例
$$ process id,可以在shell裡面使用這個紀錄到一個新的檔案 echo $$ > tmp/mypid
$? 判斷前面指令有沒有成功,成功傳回0,失敗傳回非0值 echo $?
$# shell後面跟的參數,通常用在shell裡面,可以顯示參數 echo $#
$1 代表第一個參數,$2代表第二個,以此類推 echo $1 > /tmp/argv1
$_ 代表上一個指令或者shell的最後一個變量 sudo $_
$@ 從第一個參數取到最後一個參數 for var in '$@'
!! 代表上一個指令 sudo !!

下面有一個shell可以呈現特殊符號的用法

#!/usr/bin/bash

echo $#
echo $$ > /tmp/mypid
echo '$0' $0
echo '$1' $1
echo '$2' $2
echo '$3' $3

for var in '$@'
do 
	echo $var
done

while true
do 
	sleep 1
done

執行上面的shell

[user@localhost ~] ./a.sh 1 2 3 4 5
5
$0: ./a.sh
$1: 1
$2: 2
$3: 3
1
2
3
4
5

zombie process

當parent process fork()出來一個新的child process時,child process已經執行完畢,但是bash故意不去回收child process,那執行完畢的child process就會變成zombie process

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main () {
  pid_t child_pid;
  // 創造一個行程,child_pid大於0代表是parent process
  // 等於-1代表是發生錯誤,其他就是child process的部份了
  child_pid = fork ();  
  if (child_pid > 0) { 
    /* This is the parent process. Sleep for a minute. */
    sleep (60);
  } else {
    // 讓child process立即執行完,因為parent process還在sleep
    // 所以child process馬上變成zombie process
    exit (0);  // 退出指令
  }
  return 0;
}

遇到zombie process,就要針對parent process進行刪除,使用: kill -9 pid

orphan process

當parent process比child process先執行完畢,然後parent process死掉,child process就會變成orphan process。作業系統會設定orphan process被系統第一個fork()出來的process 接收 (init或是systemd)

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main () {
  pid_t child_pid;
  // 創造一個行程,child_pid大於0代表是parent process
  // 等於-1代表是發生錯誤,其他就是child process的部份了
  child_pid = fork ();  
  if (child_pid > 0) { 
    // 讓parent process立即退出,child process沒有parent,變成orphan process
    exit (0); 
  } else {
    /* This is the child process. Sleep for a minute. */
    // orphan process會被systemd給接收
    sleep (60); 
  }
  return 0;
}

firework

參考網頁: CentOS Linux 7 以 firewalld 指令設定防火牆規則教學

firework可以根據不同環境做出不一樣的設定,在安全的網路環境簡單設定,在危險的網路環境做複雜的設定

設定的rule都只是暫時的,當系統重新啟動時,就會重製。如果要永久保存,要加上參數--permanent,就會寫進config。

防火牆設定,讓http可以連線

firewall-cmd --zone=trusted --list-all   # 查看trusted所有權限
firewall-cmd --set-default-zone=trusted  # 把zone設定成trusted,讓外面的電腦可以連到
firewall-cmd --set-default-zone=public

reload是重新讀取配置,不會造成伺服器斷線,restart會讓系統重啟。reload不等於restart,能用reload就用盡量用reload。

Linux指令