type -a echo: 查看後面的指令是內部指令還是外部命令(如果是內部指令會顯示shell builtin),內部命令會比外部命令優先執行a=5; echo a${a}a: 這個會顯示 a5a,如果沒有加上大誇號,會導致後面的aa被視為一個變數[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\
| 符號 | 含意 | 範例 |
|---|---|---|
| $$ | 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
當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。
當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;
}
參考網頁: 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。
ls /tmp && ls /temp: &&是如果前面的指令執行失敗就不會執行後面的指令,如果成功就都執行ls /etmp && echo 1 || echo 0: 如果第一個指令執行失敗就執行第三個指令,否則就執行第二個set: 可以用來顯示系統的環境變亮還有自己定義的變量env: display system enviromental variablessu -: 這個跟su一樣是切換成超級使用者,不過環境變量會不一樣