百日半狂乱

Shut the fuck up and write some code!!

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上に上げた.

doi-t/killpstree

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で確認.

続きを読む