首先編寫一個程式fork.sh如下,權限設定成可執行:
#!/bin/sh
show_the_pid_and_sleeptime()
{
sleep $1
echo 'end Job' $1 '$PPID='$PPID '$$='$$ '$!='$!
}
for i in `seq 5`
do
show_the_pid_and_sleeptime $i &
done
echo 'Program name is' $0', whose PID is' $$
CPIDs=`pgrep -P $$`
echo 'Children PIDs are' $CPIDs
wait
這個程式的會產生五個分身,Job 1會睡1秒鐘、Job 2會睡2秒鐘、...、最後一個Job 5會睡5秒鐘,睡醒後會印出來程序的一些相關資訊。執行後的結果會類似下面
$ ./fork.sh
Program name is ./fork.sh, whose PID is 25594
Children PIDs are 25596 25597 25598 25600 25602
end Job 1 $PPID=13209 $$=25594 $!=
end Job 2 $PPID=13209 $$=25594 $!=25596
end Job 3 $PPID=13209 $$=25594 $!=25597
end Job 4 $PPID=13209 $$=25594 $!=25598
end Job 5 $PPID=13209 $$=25594 $!=25600
這些內容代表的意思是
- $PPID 執行fork.sh的那個Shell的process ID
- $$ fork.sh這個程式的process ID
- $! fork.sh的影分身在執行的時候,上一個分身的process ID
Fork的威力很大,可以來拿做炸彈,在Bash中這個炸彈只要13個字元 :(){ :|:& };:
2016-Apr-25 反制Fork bomb的方法
使用ulimit限制max user processes,參考下面的指令- ulimit -a:看檔案系統與程式的限制,參考鳥哥的文章
- ulimit -u 1024:限制單一使用者最多可以跑1024個processes
_EOF_
沒有留言:
張貼留言