ptraceを駆使してscreenifyっぽいことをするreptyrがすごい
July 12, 2013 at 07:15 PM | categories: C, linux |reptyrというおもしろいものをみつけたのでご紹介
reptyr とは
reptyrとは"re-ptying"するためのプログラムで、起動中のプロセスを新しい別のターミナルにもってくることができます。 例えば、うっかりscreenやtmuxの外で起動してしまった長い時間のかかるバッチ処理を、起動したままscreenの中にもってくることができます。
https://github.com/nelhage/reptyr
使い方
$ reptyr PID
現在のターミナル内にもってきたいプロセスのpidを引数にします。 attach後は、そのプロセスの入出力は^Cや^Zも含めて新しいターミナル側を向きます。
それscreenifyでできるよ
screenifyと呼ばれるスクリプトが昔からあって、それはgdbつかって似たようなことをやってるらしいです。 でもreptyrならもっとうまくできます。
例えば従来のscreenifyには以下のような問題がありました。
- screenifyでattachしたプロセスは、元のターミナルから入力をうけつけてしまう
- ncursesをつかってるプログラムをscreenifyすると、そのプログラムはwindowのリサイズがとれなくなる
- screenifyした新しいターミナルでは^Cがきかない
reptyrはこういった問題を全部解決できます。
移植性
reptyrは対象プロセスを操作するのにptraceをつかっているのでLinuxに強く依存しており、Linuxだけをサポートしています。 SolarisやBSDに移植することも技術的には可能ですが、現状はプラットフォーム固有の部分を抽象化するようにはデザインされていないようです。
reptyrは現状ではi386, x86_64, ARMをサポートしています。他のアーキテクチャへの対応はarch以下に対応コードを追加すれば比較的容易です。
ptrace_scope on Ubuntu Maverick and up
Ubuntu Maverick以降ではptraceの機能がデフォルトで無効になっています。 以下コマンドで一時的に有効にできます。
$ echo 0 > /proc/sys/kernel/yama/ptrace_scope
rootで/etc/sysctl.d/10-ptrace.conf
を編集すると永続的に変更できます。またptrace_scope
に関する詳細な説明もここに書いてあります。
どうやってるの?
ソースを追ってみたところ以下のような処理をしているようです。
- reptyrプロセス側でptyをつくる
- attach対象のプロセスのttyのtermios設定をptyにコピーする
- ptraceで対象プロセスをattachしてレジスタ内容を一旦退避
- attachしたプロセス側でmmapし、そこにreptyrプロセス側でつくったptyをコピー
- attachしたプロセス側でコピーしたptyをopenし、setsid〜ioctlでそこに制御端末を割り当てる
- attachしたプロセス側でdup2して入出力をttyに向ける
- レジスタ内容を復元、後始末してptraceをdetach
reptyrのキモは5の制御端末をptyに割り当てるところで、これをすることによって従来のscreenifyの問題が回避できます。
しかし、単にioctl
のTIOCSCTTY
するだけではうまくいかないのでちょっとしたトリックが必要です。詳細はhttp://blog.nelhage.com/2011/02/changing-ctty/ に解説があります。
reptyrの作者は自力でこの方法を思いついたそうですが、同様のテクニックは injcode やneercs でも使用されているそうです。
reptyrってどう読むの?
repeater
のように発音してもいいけど曖昧なのでre-P-T-Y-er
(たぶんリ・ピーティーワイアー)のように発音してもよいそうです。
制約
- backgroundにしたときは前のターミナルでbgやfgを実行する必要があります。background制御はshellがやっているので、これを直すにはshell側に手をいれる必要があります。
- 現状では子プロセスがあるプロセスはattachできません
類似のもの
参考
- http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/
- http://blog.nelhage.com/2011/02/changing-ctty/
- http://blog.habets.pp.se/2009/03/Moving-a-process-to-another-terminal
まとめ
reptyrは1000行くらいの小さなプログラムですが、なかなかおもしろいハックだと思うので興味がある方はソースを読んでみて下さい。
pythonのswigエクステンションからdebian packageをつくる手順メモ
February 27, 2013 at 11:46 PM | categories: python, debian, linux |注: 以下は古めの環境(Lenny or Squeeze)と古めのpython (2.5 or 2.6)をターゲットにしたときの手順なので、最新の環境では別な方法があるかもしれません。
目次
1. 必要なパッケージをインストール
- python-setuptools
- python-all-dev
- python-support
- python-stdeb
- swig
- debhelper
- devscripts
- dh_make
たぶんこれだけあれば大丈夫。(python-supportはdeprecatedらしいけどここでは無視)
2. setup.pyをかく
apt-get source python-xxx
で適当なパッケージのソースをダウンロードして参考にするとよい
以下例
#!/usr/bin/python from setuptools import setup, Extension __version__ = "0.0.1" setup(name = "yourext", version = __version__, author = "Your Name", author_email = "[email protected], url = "http://example.com/python-yourext", download_url = "http://example.com/python-yourext-%s.tgz" % __version__, description = "yourext client library for python", long_description = open('README.md').read(), license = "LGPL", platforms = ["Platform Independent"], classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], ext_modules = [ Extension(name='yourext', sources=['path_to_swig/yourext.i'], include_dirs=['path_to_lib/include'], library_dirs=['path_to_lib/lib'], libraries=['yourlibrary'], define_macros=[(FOO_BAR, 123), (DEBUG, None)], extra_compile_args=['-std=gnu99', '-Wextra'], ) ], py_modules = ['pure_python_module_name', 'foo.bar'], include_dirs = [''], )
- ext_modulesの中にExtensionをかく
- Extension.sources にはswigの定義ファイルを直接指定できる
- Extension.include_dirs, Extension.library_dirs, Extension.librariesはそれぞれgccでいう
-I, -L, -l
の値 - Extension.define_macrosはタプルで渡す。上の例だと
-DFOO_BAR=123 -DDEBUG
の意味 - Extension.extra_compile_args はその他のコンパイルオプション
.py
ファイルをpy_modulesに含める汎用的な方法は見つからなかった。(必要な場合はスクリプトでinclude_dirsにコピーすることで対応できる)3. ビルド確認
以下コマンドでpython extのビルドを確認する。成功すると、buildディレクトリ以下に共有ライブラリが生成される
python setup.py build
4. debianizeする
以下コマンドでdebianパッケージに必要なファイルを生成する。このときegg-info等も生成される
python setup.py --command-package=stdeb.command debianize --force-buildsystem=True
5. debをつくる
debuild -uc -us
-uc -us
は署名を省略するためのオプション。
成功すると、親ディレクトリにdebファイルができてるはず
その他ツール等
- dupload: リポジトリにアップロードするためのもの
- dlocate:
dlocate -S filename
のようにすればそのファイルを含むパッケージを調べることができる - cdbs: debianパッケージを作成するための別なやりかた(?)。 ちゃんとしらべてない
おやつの時間をお知らせしてくれるUnixコマンド:at teatime (他...)
January 08, 2013 at 08:30 PM | categories: unix, tips, linux |Favorite Linux Commands(http://clippy.in/b/YJLM9W) で紹介されてたコマンドのうち知らなかったものをメモ。
at
入力されたコマンドを指定されたタイミングで実行するようにスケジュールする。 cronに登録するほどでもない単発のコマンドを実行したいときとかにつかう。 時間の指定には現在の時刻からの経過時間や絶対時間の他にteatimeやmidnightといった文字列もつかえる。 ちなみにteatimeは午後4時。 出力先を指定しなければコマンドの出力はcronと同じようにメールにとぶ。$TTYにリダイレクトしてやればコマンドを実行した端末に表示させることもできる。
例
echo "echo おやつの時間です > $TTY"| at teatime echo "echo はろー > $TTY" | at now + 3 minute
mtr
tracerouteとpingをあわせたようなもの。tracerouteより表示がみやすい。 ネットワークのどこで時間がかかってるのか一目でわかる。
例
mtr mojavy.com
column
入力テキストをいい感じのカラム表示にフォーマットしてくれる。 縦に長い出力するコマンドとか、そのままだと出力がみづらいときとかにつかう。
例
gem list | column mount | column -t grep -v '^#' /etc/apt/sources.list | column -t
reset
端末をリセットする。 うっかりバイナリファイルをcatとかしてしまって端末が壊れてしまった場合に端末を閉じずに復帰できる。
sshfs
ssh経由でリモートのファイルシステムをマウントできる。
例
sshfs name@server:/path/to/dir /path/to/mount/point fusermount -u /path/to/mount/point # unmount
その他
以下はコマンド自体の機能ではないけど覚えておくと便利かもしれないもの
curl ifconfig.me
ifconfig.meというサイトがある。自分のグローバルIPがわかる。
dig +short txt .wp.dg.cx
dnsクエリでwikipediaのエントリーがみれる。
例
$ dig +short txt banana.wp.dg.cx "Banana is the common name for herbaceous plants of the genus Musa and for the fruit they produce. It is one of the oldest cultivated plants. They are native to tropical South and Southeast Asia, and are likely to have been first domesticated in Papua New " "Guinea. Today, they are cultivated throughout the tropics. They are grown in at least 107 countries, primarily for their... http://en.wikipedia.org/wiki/Banana"
pacoを導入
October 16, 2012 at 06:30 PM | categories: paco, linux |今さらだけどpacoを導入した。
http://sourceforge.net/projects/paco/files/paco/2.0.9/ から最新のパッケージをダウンロード、展開して以下コマンドでインストール。gpacoは使わないと思うので--disable-gpacoした。
./configure --disable-gpaco
make && sudo make install
sudo make logme
何かをインストールする際は以下のようにする。
sudo paco -D make install
make install の部分は、bash install.shとかなんでもいい。
参考
About Me
mojavy |
Recent posts
95/5 Mbps とは
(August 30, 2015 at 04:22 PM)組み込み用プログラミング言語のパフォーマンス比較
(April 21, 2015 at 01:10 AM)最近読んだ本
(April 05, 2015 at 01:23 PM)Phabricatorを使ったワークフローについて
(March 02, 2015 at 08:55 PM)dnsimpleでダイナミックDNSをつかう
(December 23, 2014 at 08:02 PM)www2014のアドテク関連のResearch Trackメモ
(October 06, 2014 at 09:05 PM)flappymacs がMELPAに登録されました
(July 16, 2014 at 01:07 AM)EmacsでFlappy Birdっぽいもの書きました
(July 10, 2014 at 08:01 PM)
Recent Popular posts
Popular posts
Categories
- C (rss) (3)
- R (rss) (1)
- adtech (rss) (1)
- advent calendar (rss) (2)
- algorithms (rss) (2)
- android (rss) (2)
- aws (rss) (1)
- blog (rss) (2)
- blogofile (rss) (3)
- books (rss) (1)
- c++ (rss) (1)
- chef (rss) (4)
- common lisp (rss) (10)
- debian (rss) (2)
- dns (rss) (1)
- elasticsearch (rss) (1)
- elf (rss) (1)
- elisp (rss) (1)
- emacs (rss) (5)
- english (rss) (1)
- game (rss) (2)
- gearman (rss) (1)
- git (rss) (1)
- github (rss) (1)
- gitlab (rss) (1)
- golang (rss) (2)
- history (rss) (1)
- impress.js (rss) (1)
- internet (rss) (1)
- ios (rss) (3)
- jekyll (rss) (1)
- jenkins (rss) (1)
- linux (rss) (4)
- lisp (rss) (2)
- ltsv (rss) (1)
- lua (rss) (1)
- mac (rss) (3)
- mach-o (rss) (1)
- memo (rss) (2)
- mustache (rss) (1)
- note (rss) (1)
- objective-c (rss) (4)
- os (rss) (1)
- osx (rss) (2)
- others (rss) (1)
- paco (rss) (1)
- pdf (rss) (1)
- php (rss) (2)
- postfix (rss) (1)
- programming (rss) (12)
- project management (rss) (1)
- python (rss) (5)
- quicklinks (rss) (6)
- raspberry pi (rss) (2)
- redmine (rss) (1)
- reveal.js (rss) (1)
- ruby (rss) (10)
- sbcl (rss) (2)
- security (rss) (1)
- shell (rss) (2)
- smtp (rss) (1)
- solr (rss) (1)
- statistics (rss) (2)
- tips (rss) (10)
- tmux (rss) (3)
- toml (rss) (1)
- tools (rss) (1)
- twitter (rss) (1)
- ubuntu (rss) (1)
- unix (rss) (5)
- v8 (rss) (1)
- web (rss) (7)
- xcode (rss) (1)
- zeromq (rss) (2)
Archives
- August 2015 (1)
- April 2015 (2)
- March 2015 (1)
- December 2014 (1)
- October 2014 (1)
- July 2014 (3)
- March 2014 (6)
- February 2014 (4)
- November 2013 (3)
- October 2013 (4)
- September 2013 (2)
- July 2013 (2)
- June 2013 (2)
- May 2013 (1)
- April 2013 (6)
- March 2013 (3)
- February 2013 (8)
- January 2013 (5)
- December 2012 (1)
- November 2012 (6)
- October 2012 (7)
- August 2012 (1)
- July 2012 (9)
- June 2012 (1)
- April 2012 (1)
- December 2011 (2)
- November 2011 (2)