cygwin で nice

nice / renice を使うと起動するプロセスや起動済のプロセスの優先度を変更することができます。
 
nice の書式:

nice [-n 数値 ] 実行するコマンド [引数] ..

例:

$ nice -n 10 sleep 100 # nice 10 sleep 100 は間違い

 
renice: の書式:

renice 数値 [ [-p] PID ] [ [-g] pgrps] [ [-u] ユーザ]

指定した PID (またはプロセスグループ(PGID)、ユーザ)のプロセスの優先度を指定した数値に基づいて変更します。
Cygwin で実行する場合、PID にはWindows 上の実 PID (WINPID)ではなく、Cygwin で ps すると見られる仮想 PID を指定します。
 
例1: PID で指定

$ sleep 50 &
[1] 1448
$ renice 10 -p 1448

例2: PGID で指定

$ ps
      PID PPID PGID WINPID TTY UID STIME COMMAND
     2264 2248 2264 316 con 11363 13:31:29 /usr/bin/sleep
     2168 2248 2168 2168 con 11363 13:31:33 /usr/bin/bash
     2948 2168 2168 2920 con 11363 13:31:33 /usr/bin/sleep
$ renice 19 -g 2168 # PGID が 2168 の全てのプロセスが対象

例3: ユーザ名で指定( cygwin 経由で起動しているプロセスのうち実行ユーザが john のプロセス全ての優先度を -10 (通常以上)にする)

$ renice -10 -u john

 
Windows XP で実行した場合のプロセス優先度の対応表:

nice -n

プロセス優先度

12以上

4 〜 11

通常以下

-4 〜 3

通常

-12 〜 -5

通常以上

-19 〜-13

-20 以下

リアルタイム

参考:
起動するプログラムの優先度を変更する方法(@IT)
タスクマネージャを使った変更方法と、cmd.exe の start コマンドを使った優先度指定方法についてかかれています。

GDB でコアダンプの原因を探る

プログラム実行中に Segmentation Fault や Bus Error などで Core dumped となった場合、
core ファイル(または *.core)が作業ディレクトリに出力されます。
 
これを解析する場合, GDB(GNU Project Debugger)コマンドが有用です。

$ gdb <コアダンプした実行可能バイナリ> <コアダンプファイル>

例えば以下の perl のスクリプト(仮に foo.pl とします)の実行中にコアダンプした場合..

#!/bin/perl
 
# 何かの処理
 

この場合はスクリプト(foo.pl)ではなく、実際にコアダンプしたバイナリプログラム(/bin/perl)について gdb を実行します。

$ gdb /usr/bin/perl core
GNU gdb 4.18 (FreeBSD)
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-unknown-freebsd”…Deprecated bfd_read called at /usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c line 2627 in elfstab_build_psymtabs
Deprecated bfd_read called at /usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c line 933 in fill_symbuf
 
Core was generated by `perl’.
Program terminated with signal 11, Segmentation Fault.
 
以下ライブラリ読み込み、エラー箇所表示が続く

 
具体的なトレースの仕方については参考サイト参照のこと。
 
参考:
gdbを用いたデバッグ
  core ダンプ解析方法を含む GDB によるデバッグの基本が分かりやすく書かれています。
 
Debugging with GDB(日本語)
  GDB 公式ドキュメント日本語訳

servname not supported for ai_socktype エラー

chroot 環境で作業をしていたら whois でこんなエラーが。

$ whois google.co.jp
whois: jp.whois-servers.net: servname not supported for ai_socktype

調べてみると、原因は /etc/service の不備でした。
whois の場合、/etc/service に

nicname 43/tcp whois
nicname 43/udp whois

がないのが原因です。
 
参考:
Error: Servname not supported for ai_socktype

CUI メーラーを使う

– ローカルにあるメールを読みたい
– メールサーバにあるメールを POPや IMAP 経由でいちいちダウンロードすることなく SSH でつないでそのまま読みたい
 
という場合に便利なのが、mutt というCUI メーラです。
 
日本語対応版パッチ, RPM はここからダウンロードできます。(FreeBSD の ports では mail/mutt)
 
利用の際はMutt Japanese Editionにある、日本語マニュアルが大変参考になります。
 
たとえば

mutt -f ./Maildir

とすれば、カレントディレクトリの Maildir を参照し、その中にあるメールの閲覧、削除、返信等ができます。

q:中止 d:削除 u:復活 s:保存 m:メール r:返信 g:全員に返信 ?:ヘルプ
   1 May 31 **** project ( 0) [*****] 登録内容確認のお願い
   2 Mar 21 Charlie Root ( 0) ClamAV Scanning Report
   3 O Mar 21 Charlie Root ( 0) www.ecoop.net security updates
   4 O Mar 21 Charlie Root ( 0) test
   5 Mar 21 Cron Daemon ( 0) Cron <root@local> /root/sbin/task.sh
   6 N Mar 21 ********* ( 0) <<重要>>「******」登録依頼用認証コード
   7 N Mar 21 ********* ( 0) <<重要>>「*******」登録依頼用認証コード
   8 N Mar 21 ********* ( 0) 「******」登録確認メール
 
-*-Mutt: postmaster [Msgs:8 3.0M]—(date/date)————————-(all)—

詳細はマニュアルに譲りますが、大まかな使い方は
– mutt -f /path/to/Mailbox でメールボックスを開き
– エンターで、指定メールを開く
– スペースでページを送る(最後尾の場合次のメールに切替え)
– メール表示中 q でメール一覧に戻る
– d で指定メールを削除
– メール一覧表示中 q で mutt 終了
です。ちなみに一覧で
– N とフラグが立っているのが新規メール
– O とフラグが立っているのは未読の古いメール
– D とフラグが立っているのは d キーで削除チェックをいれたメール(この状態でメーラを終了するとその時に削除されます)
– フラグの無いものは、既読メール
です。

シェルの for ループで for file in $filelist とした時の問題と対策

複数のファイルに対する処理を for ループで行うと

for file in file1 file2 ‘file3 abc’; do
  ls $file
done

のように書け、

file1
file2
file3 abc

のような結果になりますが、
ユーザが指定したファイル群に対して処理をしたいとき、for ループで次のようにすると

$filelist=”
file1
file2
‘file3 abc’

for file in $filelist; do
  ls $file
done

とすると、

file1
file2
‘file3
abc’

となってしまいます。
 
この対策として . でスペースを置換するアドホックな対応をしてみました。

filelist=”
file1
file2
‘file3 abc’

for file in ` echo “$filelist” | sed -e ‘s/\\./\\\\./g’ -e ‘s/ /./g ‘`; do # 既存の “.” は “\.” に, ” ” は “.” に置換
    file=`echo “${file}” | sed -e ‘s/\\./ /g’ -e ‘s/\\\\././g’` # 置換を元に戻す
    ls “$file” # “” で囲むのは必須
done

結果:

file1
file2
file3 abc

 
他にいい方法があれば是非御連絡を m(. .)m

権限があっても削除/変更不可能にする

Linux なら chattr, FreeBSD なら chflags を使うことで、 root 権限でも rm -f で削除不可にすることが可能です。
たとえば /bin ディレクトリ以下すべてを削除不可能にするには

# Linux
chattr +i /bin

 

# BSD
chflags schg /bin/* /bin

 
とすれば削除できなくなります。
 
参考:
http://www.linux.or.jp/JF/JFdocs/Chroot-BIND-HOWTO-2.html
UNIX の部屋 chflags
FreeBSD memo – jail の作り方
MANPAGE of chflags

画像や PDF, 動画を SWF に変換する

swftools (ports: graphics/swftools)
以下のツールを提供する GPL のコレクションパッケ−ジです。

PDF2SWF – PDF から SWF への変換
SWFCombine – 複数の SWF を 1つの SWF でラップして結合する。
SWFStrings – SWF 中の文字列を読み取る
SWFDump – SWF のさまざまな情報を得る
JPEG2SWF – JPEG 画像から SWF への変換
PNG2SWF – PNG 画像から SWF への変換
GIF2SWF – GIF 画像から SWF への変換
WAV2SWF – WAV 音声から SWF への変換
AVI2SWF – AVI 動画から SWF への変換
Font2SWF – TTF, Type1 フォントファイルから SWF への変換
SWFBBox –
SWFC – SWF コンパイラ(スクリプトから生成)
SWFExtract – SWF 中のムービークリップ、音声、画像などの抽出
 
RFXSWF Library – 素材を含む, SWF 作成用のライブラリ

 
以下は jpeg2swf の利用例です。

# src フォルダの全ての JPEG をフレームレート 3fps の
# SWF ムービーに変換して out.swf として保存する( -z は圧縮オプション)。
jpeg2swf -r 3 -z -o out.swf src/*.jpg

簡単に CRLF を LF に変換する(CRLF2LF)

次のように入力することで、sjis.txt の CR+LF を LF だけに変換し、out.txt として保存することができます。

$ cat sjis.txt | perl -pe ‘s/\r$//’ > out.txt

CGI やシェルスクリプトを、Windows などで書いた場合などは末尾に CR が入っていると, 一行目を正しく認識できないために “bad interpreter” と出るので、その対策によく使います。
 
追記:
(2006-08-08) /usr/games/fortune freebsd-tips で、次の方法も紹介されてました。

col -bx < dosfile > newfile

(2007-07-13) ↑の、col は日本語には対応していないようで、SJIS の日本語文字を含んでいると化けてしまいました。