perlでforkするメモ

perlでforkする実験を色々してみた。
結構色々分かったのでメモ。

  • 親が子を作って、プログラムをコピーして渡して実行する
  • 親が子を作った時のグローバル変数はそのままコピー?ループカウント変数は保持したまま。
  • 子が最初からプログラムを純粋に実行するわけではない?
#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# 並行して生むことが出来る子の数
my $child_max = 3;
my $child_num = 0;

# 処理は30回
my $roop_max = 30;
my $roop_count = 0;

my ($pid, $wait_pid, $sleep_time);

while ($roop_count != $roop_max) {
    $pid = fork;
    # 親が子を生むときは子のPIDを返す
    # 子がforkするときは0を返す
    # 失敗したら未定義値を返す
    if ($pid ne 0) {
        # 親の処理
        $child_num++;
        print "roop[$roop_count] fork child: ]
            all_child_num[$child_num] child_pid[$pid]\n";
    } elsif (defined $pid) {
        # 子の処理
        $sleep_time = rand 10;
        print "roop[$roop_count] start child process task:
            all_child_num[$child_num] task[sleep $sleep_time]\n";
        sleep $sleep_time;
        exit 0;
    } else {
        exit 1;
    }

    # 親の子プロセス数管理
    if ($child_num == $child_max) {
        print "roop[$roop_count] start  wait child process: 
            all_child_num[$child_num]\n";
        $wait_pid = wait;
        $child_num--;
        print "roop[$roop_count] finish wait child process:
            all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
    }

    $roop_count++;
}

# 子プロセスが全て終わるのを待つ
# wait()はどれかの子プロセスを待つ
# waitする子プロセスが無ければ-1を返す
while ($wait_pid ne "-1") {
    $wait_pid = wait;
    print "roop[$roop_count] wait all child process:
         all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
}

Doverからみる32と606のラスト考察

Edward Greenといえば、やはりDover。
個人的に最も好きなのもDover。

DoverはDoverでも、ラストによって全然雰囲気を変えてしまうのが、Edward Greenの魅力でもありすごいところでもある。

今回は、Green至上最も細身のラストと呼ばれている32と、202をほんのりとスクエアトゥにした606のラストの外見を比較してみた。

続きを読む

Dover E606 Dark Oak Antique

円高が進んだせいで、予定外の買い物をしてしまった(言い訳)。

しかし、予定外以上に満足いくものだった。
英国本国のエドワードグリーンとメールでやりとりして、かなり格安で手に入れることができた。

購入した靴は、DoverのE606である。

続きを読む

簡易バックアップスクリプト

簡単に作ってみた。

#!/usr/bin/perl

use warnings;
use strict;

my $retval = "1";
my $master_dev = "/dev/sda1";
my $backup_dev = "/dev/hdc";
my $backup_dev1 = "/dev/hdc1";
my $master_dir = "/";
my $backup_dir = "/backup";
my $log = "/var/log/backup.log";


print "backup $master_dir ($master_dev) -> $backup_dir ($backup_dev1)\n";

my $mount_chk = `mount | grep $backup_dir | grep $backup_dev1`;
chomp($mount_chk);
print "mount_check: ";

if ($mount_chk ne "") {
    print "OK\n";

    print "tune2fs: ";
    $retval = system("tune2fs -c -1 -i 0 $master_dev > $log 2>&1");

    if ($retval eq "0") {
        $retval = system("tune2fs -c -1 -i 0 $backup_dev1 >> $log 2>&1");

        if ($retval eq "0") {
            print "OK\n";
        } else {
            print "NG\n";
            exit(1);
        }
    } else {
        print "NG\n";
        exit(1);
    }

    sleep 3;

    print "rsync: ";
    $retval = system("rsync -avx --delete $master_dir $backup_dir/ >> $log 2>&1");

    if ($retval eq "0") {
        print "OK\n";
    } else {
        print "NG\n";
        exit(1);
    }

    print "grub-install: ";
    $retval = system("grub-install --root-directory=$backup_dir $backup_dev >> $log 2>&1");

    if ($retval eq "0") {
        print "OK\n";
    } else {
        print "NG\n";
        exit(1);
    }

} else {
    print "NG\n";
    exit(1);
}

そろそろバックアップをした方が良い年になってきた。
昔は、DISK壊れても、1から作り直せる程度のものが多かったが、今は無理!
これでしばらくは大丈夫かな。

実行後

# ./backup.pl
backup / (/dev/sda1) -> /backup (/dev/hdc1)
mount_check: OK
tune2fs: OK
rsync: OK
grub-install: OK

LVMをマウントしてデータを抜き出すメモ

LVMを用いてファイルシステムを構築していて、そのHDDが壊れた時など、データ損傷し過ぎでどうにもこうにもいかなくなることがある。
そこで、別OSを起動してその壊れたHDDをマウントし、必要なデータを抜き出すにはどうしたらいいか。

ちょっと苦戦したので、そのメモ。

1,OS起動中にSATAを認識させる(HDDをSATAケーブルで接続後)

# echo "scsi add-single-device 01 00 01 00" > /proc/scsi/scsi

※数字は「scsi番号 Channel Id Lun」、今回は「01 00 01 00」だった。

2,SATAが認識されたか確認

# cat /proc/scsi/scsi
Host: scsi1 Channel: 00 Id: 01 Lun: 00
  Vendor: ATA      Model: Maxtor 6Y080M0   Rev: YAR5
  Type:   Direct-Access                    ANSI SCSI revision: 05

3,LVMがデバイス内にあるか、物理ボリューム→ボリュームグループ→論理ボリュームの順にスキャン

# pvscan
  PV /dev/sdb2   VG VolGroup00   lvm2 [76.22 GB / 32.00 MB free]
  Total: 1 [76.22 GB] / in use: 1 [76.22 GB] / in no VG: 0 [0   ]

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VolGroup00" using metadata type lvm2

# lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [74.25 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [1.94 GB] inheri

4,マウントしたいLVMボリュームグループを有効化

# vgchange -ay VolGroup00

5, /dev内にLVMのボリュームが見えるようになったので、マウント

# mount /dev/VolGroup00/LogVol00 /mnt
# ls /mnt/
bin/  boot/  dev/  etc/  home/  lib/  lost+found/  media/  misc/  mnt/  net/  opt/  proc/  root/  sbin/  selinux/  srv/  sys/  tmp/  usr/  var/

6,データ吸出しちゃってください。