SIGSTOPで停止したプロセスにSIGTERMを送ってもプロセスが死なない?
二十五日半狂乱3日目の記事
もはや、Advent Calendarでもなんでもなくなっているけど、そんな悲しい現実はさておいて.
前回の話がstackoverflowですでに議論され尽くされていて、解答の一つに自分のスクリプト似た構造のシェルスクリプトがあった.
#!/bin/bash killtree() { local _pid=$1 local _sig=${2:-TERM} kill -stop ${_pid} # needed to stop quickly forking parent from producing child between child killing and parent killing for _child in $(ps -o pid --no-headers --ppid ${_pid}); do killtree ${_child} ${_sig} done kill -${_sig} ${_pid} } if [ $# -eq 0 -o $# -gt 2 ]; then echo "Usage: $(basename $0) <pid> [signal]" exit 1 fi killtree $@
シグナルを指定できるし、親プロセスをstopしてから子スレッドの操作をするしで、悲しいかなこっちの方が断然良い出来だ.
そんなことを思いつつ、この投稿に対するコメントを眺めていると、
Stopped processes don't get killed with SIGTERM. See my answer – x-yuri Nov 20 '12 at 20:32
などという指摘があった.
中断したプロセスにkill TERMしてもプロセスが殺されないとは知らなかった.
もう少し遊んでみることにする.
続きを読む指定したプロセスIDのプロセスとその子孫全てを再帰的にkillするシェルスクリプト
二十五日半狂乱、2日目の記事.
実行中のプロセスをkillしたいが、対象のプロセスをkillすると子プロセスがゾンビ化しちゃうからプロセスツリーを丸ごとkillしたくなった.
どうせならkillコマンドっぽくプロセスIDで指定して、指定したプロセスをrootとしてツリーの葉から根に向かってツリー上のプロセスをkillして回りたい.
車輪の再発明の匂いがプンプンするので、「そんなのこうすれば一発じゃん.」ってのがあったらご指摘いただけたらと思います.(※議論し尽くされていました)
追記:後日、↑のリンク先にある"より良いコード"について書いたので、こちらも参考をば.
コードはgithub上に上げた.
READMEにも書いたけど、目的を達成するシェル関数*1は気持ちいいくらいにシンプル.
killpstree(){ local children=`ps --ppid $1 --no-heading | awk '{ print $1 }'` for child in $children do killpstree $child done kill $1 }
*1:関数である必然性なんてないんですが.
アウトプットを続けるきっかけとしてのAdvent Calendar
二十五日半狂乱、1日目の記事.
技術系Advent Calendar
なにやら技術系Advent Calendarなるものが、盛り上がっているらしい.
1日(もとい2日)出遅れているけど今日からひっそり流行に乗ってみようと思う*1.
と言っても、個人的にテーマは決めずに書きたいこと書く.
テーマ決めないと意味なくない?って突っ込みがあったりしたんだけど、あくまで書き続けるためのきっかけとして.
とまぁ何かこう決意表明の一つでもしておかないと、とても25日も書き続けられないような気がするので、以下に自分を励ますためのメモをば.
*1:この記事はすなわち水増しだ!
VirtualBoxのゲストOS(Linux)にホストOS(Windows)のDropboxをマウントする
方法
Virtualboxの[設定]→[共有フォルダー]でホストOSのDropboxを追加
設定したOSで以下を行う.
$ mkdir /mnt/Dropbox $ ln -s /mnt/Dropbox ~/Dropbox $ sudo vi /etc/fstab dropbox /mnt/Dropbox vboxsf defaults,uid=1000,gid=1000,dmask=0077,fmask=0077 0 0 $ sudo mount -a
Ubuntu 12.04とDebian wheezyで確認.
続きを読む