それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

chrome(webdriver)を headless はリサイズできないので、初期値で決めて解決させる

headless で動かしてる chrome でエラーが出る。

最初、なんのエラーかわからず悶絶してた。理由がわかったので書いておきます。

リサイズすると次のようなエラーに

driver.manage.window.resize_to(1200,1200)

エラー

Selenium::WebDriver::Error::UnknownError: unknown error: cannot get automation extension
from unknown error: page could not be found: chrome-extension://aapnijgdinlhnhlmodcfapnahmbfebeb/_generated_background_page.html
  (Session info: headless chrome=61.0.3114.0)
  (Driver info: chromedriver=2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b),platform=Mac OS X 10.11.6 x86_64)
from /Users/takuya/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'

なぜリサイズが必要だったのか?

とあるサイトが、レスポンシブ・デザイン(笑)になっていて、Widthにより、コンテンツの表示内容が変化する。そのためボタンがクリックできずに、 stale エラーやnot clickable で落ちてた。

headless chrome のデフォルトウインドウサイズ 800x600

Chromeのheadless は 次のようになっている。

>> driver.execute_script('return window.innerHeight;')
=> 600
>> driver.execute_script('return window.innerWidth;')
=> 800
>>

これでは、モバイルサイトや、タブレット配置にされちゃいますよね。スマホサイトは無駄にクリックと遷移がおおく、スクレイピングに向かないので不便。

初期値を投入してリサイズの代用にする。

chrome の起動オプションに「ウインドウサイズの指定」があるのでコレを活用することで問題はほとんど解決しますね。

  caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    "chromeOptions" => {
      "args" => [
        "--headless", #headlessにすると動かない・・・
        "--window-size=1280,800", # width 入れると解決する。

起動オプション設定後のウインドウの高さと幅

縦横のサイズは次のようになったので、無事解決しました。

>> driver.execute_script('return window.innerHeight;')
=> 1200
>> driver.execute_script('return window.innerWidth;')
=> 800
>>

Chrome の headlessで落ちてた原因は殆どが、モバイルサイト落ち

PCサイトでデザインした、ClickやSubmitが動かない原因の大半が、モバイルサイト落ちになって発生していた。

ボタンが見つからない、Staleされる、not clickable などになる。頭のなかで、PCサイトを想定していると迷う。デバッガでみるとちゃんと要素はあるのに、クリックが出来ない。

クリック出来ない理由がわからず、悶絶して苦悩することになった。

レスポンシブデザインは気づかずに導入されてるので注意が必要だった。

どうでもいいけど。

レスポンシブデザインって、モバイル・PCでガッツリとデザインを変えるんじゃなくて、もともと目指してたのは要素を横長から縦長に再配置して、同じように見せてアクセシビリティを確保するんじゃなかったのか。

いつの間にか、ガッツリデザインをかえてメニュー項目を展開メニューに折りたたんだりしてるんだよね。そもそも使いにくいのでやめてほしい。そこまでやるなら、もう別サイト・別HTMLでデザインした方がいいよね。。。。

Selenium でモバイルエミュレーション

seleniumでモバイルエミュレーションを使いたい

ChromeのWebDriverでモバイル・エミュレーションを使えれば便利なのに。回線速度とか、画面の回転とか、画面のサイズとか、逐次セットするのは面倒なので、セットになってるモバイル・エミュレーション機能を使えば楽なのに。

と思って調べたら

出来る

caps = Selenium::WebDriver::Remote::Capabilities.chrome(
   "chromeOptions" => {
      "mobileEmulation" => {
         "deviceName" => "Google Nexus 5" }
       }
   )

Capabilitiesのオプションに渡せば出来る。これはRubyなので 設定にアクセスに階層にハッシュをつかうけど、JavaPythonならキーでアクセスですね。mobileEmulation.deviceNameがキーですね。

selenium で Google Chromeの開発者ツールにアクセスする

Selenium から 開発者ツールにアクセスしたい。

DevtoolsがChromeで閉じられちゃうので、なんとかならないのかなと思って調べてた。

パフォーマンスタブにアクセスできる

 driver.execute_script("return window.performance.getEntries();")

これでなんとかなるかもしれない。

ちなみに、Chrome+WebDriverで開発者ツールが閉じられちゃうのは理由がある。

Chromeの制限で、デバッグにアクセスできるのは常に1つだけ。がある。

そのため、webdriverでアクセスすると、いったん開発者ツールを閉じてWebdriverが実行される。排他処理が実行されてる

selenium で parital text/ link_text を指定すれば楽ができる!!!!

selenium でリンクの指定が楽になった。

ドキュメントを読んでたら、良いものを見つけた 今までのやり方。

driver.find_element(:xpath, "//a[contains(./text(), 'ログイン')]")
driver.find_element(:xpath, "//a[./text()='ログイン']")

今回知ったやり方:1

partial_link_text を指定すれば、文字列 を含むリンクを取れる

driver.find_element(:partial_link_text, "ログイン").click

今回知ったやり方:2

link_text を使えば、文字列に一致するリンクを取れる。

driver.find_elements(:link_text => "戻る").click

参考資料

selenium documentation

Evernote で選択中ノートを全て指定したノートに移動する

Evernote のノートをまとめて移動したい

Evernoteのノートが増えてくると、検索結果をまとめて別のノートに移動したいとか。そういう事が増えてくる

それも「キーボードショートカット」で!

キーボードショートカットを作るには?

Mac でキーボードショートカットを作る方法を知って無くてはならない。

Macでは⌘キーは、メニューの各項目(コマンド)を実行する、と考える。つまり、キーボードショートカットを「作る」には「メニュー項目を追加する」という作業になる。メニュー項目は「サービス」として追加できる。アプリ(:またはファイル)ごとに好きな「サービス」を追加することが出来る。

サービスの追加場所

サービスの追加場所はここになる。ここに好きなサービスを作って放り込む

~/Library/Services/

サービスの作成方法

サービスの作成方法はAutomator.appを使うのが楽でいいっすね。

Evernoteにサービスメニューを追加する。

  1. AutomatorでWorkflowを新規作成し
  2. 対象アプリをEvernoteにする。
  3. そしてやりたいことを記述。
  4. 最後に~/Library/Services に保存する。

キーボードショートカットを追加

キーボードショートカットをPreferenceで追加する。

Evernoteで選択したノートを移動させるスクリプト

Automatorで、AppleScript(language:JS)を実行すると、選択したノートを指定した場所に移動することができる。

わたしは、利便性を考慮、つまりテストのしやすさと扱いやすさを考えて、すべてのサービスをシェルコマンドで作成し、Automatorではシェルコマンドを実行するようにしている。

#!/usr/bin/osascript -l JavaScript -i
ObjC.import('stdlib')  
//コマンドライン引数を取る
function run( argv ){
  if( argv.length < 1 ){
    console.log("引数が必要")
    $.exit(1)
    } 
    move_selected_note_to(argv[0])
  $.exit(0)
}

//Evernote で選択中ノートを全て指定したノートに移動する
function move_selected_note_to( notebook_name ) {

  var app = Application("Evernote");
  var notebook = app.notebooks[notebook_name];
  var selected = app.selection();

  selected.forEach( function(e){
    e.move({to:notebook});
  } )

}

vim で .viminfo を保存反映するとyankバッファが共有されて嬉しい

vim の作業中情報は .viminfoに書かれている。

.viminfoのファイルに必要なデータが保存されている。

作業中のVimから別のVimへデータを引き継ぐには、 .viminfo を使うと実現できる。

vim から vim へ.viminfoを使うには

端末Aが作業中のvim で 端末Bがtmuxやsshでもう一つ起動したvim

  • 端末Aのvim:wvを実行
  • 端末Bのvim:rv! を実行

以下の通り

すると、端末A/Bでの作業は次のように反映されていく。

  1. 端末Aのvim:wv を実行して
  2. 端末A現在の選択状態やヤンクバッファを .viminfoに書き出す
  3. 端末Bのvim:rv! を実行して
  4. 現在の起動中のvim に.viminfoの内容をロードする

また、:wv はで.viminfoを保存しておけば

次のvim起動時に .viminfo を読み込むので、起動後に状態を反映したいときに便利。

またうっかり .viminfo を消してしまったとしても、すでに.viminfoを読み込んだvim がまだ起動していれば、 :wv で読み込み中の内容をダンプ出来る。

ipythonの入力履歴を見る

ipython の入力履歴をみたい

ipythonの入力のヒストリファイルはどこにあるのか調べたのでメモ

~/.ipython に ipython のファイルがある。

しらべたら次のところにファイルがあった *1

~/.ipython

最近のLinuxなら ~/.config にファイルを集める傾向があるので、将来的には ~/.config/ipython かもしれない

入力履歴はプロファイルにある

入力履歴を始め、ipythonは「実行環境」としての設定をプロファイルで保存してるのでここにあった。

~/.ipython/profile_default/

入力履歴を見る。

入力履歴は sqlite3 のデータベースファイルになっていたので、ここから、必要なデータを取り出せば、入力のヒストリを取得することができる。

sqlite3を使って履歴を取得

sqlite3 .ipython/profile_default/history.sqlite  -line ' select source_raw from history;'

出力履歴も残っている

出力履歴も合わせて見るなら、カラムごととりだせば見ることができる。

sqlite3 .ipython/profile_default/history.sqlite  -line ' select * from history;'

入力と出力の履歴を同時に保存して後で見るのは便利。 jupyter と同じ感じなのね

*1: 2017/05/30 現在

Xpathで隣り合う前後要素を取得/ 兄弟・姉妹要素を取る

xpath で隣り合う要素を取得するには

妹(弟)ノードを取りに行く。

id("gaika_k")/following-sibling::div

あるノードの弟ノードをとるには、あるノードを指定してから following-sibling::タグ名とすれば取ることができる。

姉(兄)ノード

姉を取りに行くなら

id("gaika_k")/preceding-sibling::div

precedingを代わりに使えば同じように、上のノードが取れる。

xpath は成れてくるとCSSより細かい指定や適当な指定ができて、xpath書きやすい。

xpath で要素をRange(範囲)指定する。( index で範囲指定 )

Xpathで要素を範囲指定するには

position() 関数と組み合わせて戦える。

//tr[ position() > 0 ]

これは指定番目を1つ取り出す次の書式の発展系と考えればわかりやすい

1番目のtrを取り出す。
//tr[ 1 ]
1番目より後ろの trを取り出す。
//tr[ position() > 1 ]

テーブルなどで指定行から先、指定列から先を取り出したいときによく使う。

//table//tr[poisition() > 3]//td[position() > 1]

lsでファイルを拡張子ごとに並べる

ファイルを種類順に並べたい。

デスクトップの整理でよく見る「ファイルを種類別」に整理と同じ、ファイルを種類順にまとめて結果に表示を ls コマンドでもできることがわかった。

-X で拡張子でまとめて表示

ls -lX

こうすると、ext 順にまとめて表示してくれるので、少し楽。 split コマンドなどと組み合わせたら便利かもしれない。

参考資料

man ls

lsで日付ファイル名の逆順に並べる並べ方

ls で日付・ファイル名・ファイルサイズなどを昇順・降順に並べたい

ファイルを並べて結果をだすときに、新しいものから処理したいとか、古いものから処理したいことがあるよね。

ls でファイルの日付順に並べる

新しいものが先になるように並べるには

ls -lt

ls でファイルの日付の逆順(古いものが先

古いものが先(older first)になるように並べるには 。逆順オプション -r を使う

ls -ltr

サイズ順で並べる場合にも使える

ls -lS # サイズ降順(larger first
ls -lSr # サイズ昇順 ( smaller first

別のやり方

tac コマンド を使うと、このオプションを知らなくても戦える。

tac コマンドは cat コマンドの逆スペリングになっていて、その意味は cat と出力順が逆になる。

ls -lt |tac  #ls -ltr とおなじ

参考資料

man ls

cygwinのインストールでUAC(Admin昇格)を不要にする

Cygwin のインストールにオプションがつかえた。

今更知った。もっと早く知っていれば。

./setup-x86-64.exe --no-admin

これをつけることでインストール時に、Admin権限を要求されないので、UACの権限がなくてもインストールが可能になる。

たぶんデスクトップやスタートメニュー作成で権限が要求されているので、UAC昇格で管理者権限が必要だとおもっていたCygwinも管理者権限を使わずにインストールすることが可能になっている。

cygwin のインストールオプション

そのほかにもいろいろなオプションがあって、パッケージ管理ができるようになっていてうれしい。

PS C:\Users\takuya\Desktop\cygwin>
Command Line Options:

 -D --download                     Download from internet
 -L --local-install                Install from local directory
 -s --site                         Download site
 -O --only-site                    Ignore all sites except for -s
 -R --root                         Root installation directory
 -x --remove-packages              Specify packages to uninstall
 -c --remove-categories            Specify categories to uninstall
 -P --packages                     Specify packages to install
 -C --categories                   Specify entire categories to install
 -p --proxy                        HTTP/FTP proxy (host:port)
 -a --arch                         architecture to install (x86_64 or x86)
 -q --quiet-mode                   Unattended setup mode
 -M --package-manager              Semi-attended chooser-only mode
 -B --no-admin                     Do not check for and enforce running as
                                   Administrator
 -W --wait                         When elevating, wait for elevated child
                                   process
 -h --help                         print help
 -i --ini-basename                 Use a different basename, e.g. "foo",
                                   instead of "setup"
 -0 --allow-unsupported-windows    Allow old, unsupported Windows versions
 -v --verbose                      Verbose output
 -l --local-package-dir            Local package directory
 -r --no-replaceonreboot           Disable replacing in-use files on next
                                   reboot.
 -X --no-verify                    Don't verify setup.ini signatures
 -I --include-source               Automatically include source download
 -n --no-shortcuts                 Disable creation of desktop and start menu
                                   shortcuts
 -N --no-startmenu                 Disable creation of start menu shortcut
 -d --no-desktop                   Disable creation of desktop shortcut
 -K --pubkey                       URL of extra public key file (gpg format)
 -S --sexpr-pubkey                 Extra public key in s-expr format
 -u --untrusted-keys               Use untrusted keys from last-extrakeys
 -U --keep-untrusted-keys          Use untrusted keys and retain all
 -g --upgrade-also                 also upgrade installed packages
 -o --delete-orphans               remove orphaned packages
 -f --force-current                select the current version for all packages
 -Y --prune-install                prune the installation to only the requested
                                   packages
 -m --mirror-mode                  Skip availability check when installing from
                                   local directory (requires local directory to
                                   be clean mirror!)
 -A --disable-buggy-antivirus      Disable known or suspected buggy anti virus
                                   software packages during execution.



sysd の管理単位-ユニット

systemd の管理単位

systemd は起動のすべてを 「ユニット」という単位で管理する。

ユニットは「Service」が代表例で、/etc/init.d/ に記述するようなサービスDaemonはすべて「Service unit」 として管理される。

ユニットには、service の他に、 target mount service device などがある。

これらのユニットには依存関係が記述されている。systemd はこれらの依存関係を事前に読み込んで解釈し「起動順序」を明確にする。それにより起動処理をマルチ化して高速化が可能になっている。

旧来に sysV init では /etc/rcX.d に記述されたスクリプトを「一つずつ」順番に起動していたので時間がかかっていた。Upstartでもこのあたりの解決は試みられていたがLinuxはSystemdを採用する方向のようです。Systemdから今後も変わらないことを祈るばかりです。

事前ロードがポイント

事前に依存関係や要求関係や、どのタイミングで実行するか。それらを解釈して並び替える処理が入る。その並び替え・依存関係・タイミングの管理単位が「ユニット」。

そのためリロードが必要。

常駐する自作ユニットファイルでデーモンを動かすときに、 daemonsのunit をリロードしてキャッシュを更新しないといけない。

sudo systemctl daemon-reload

そのためこのリロードコマンドが必要になっている。

ユニットの種類

systemd のユニットのタイプ別に一覧する。

ユニットはその役割ごとにそれぞれタイプが存在する。それは次のようになっている。

takuya@:~$ systemctl list-units  --type
automount  device     mount      path       service    snapshot   socket     swap       target     timer

よく使うのは、service 一覧だと思う。

参考資料

http://enakai00.hatenablog.com/entry/20130914/1379146157

systemd のファイルについて

systemd のファイルについて

debian での systemd の構成について調べた

systemd のユニットファイルが置かれている場所

  • /lib/systemd/
  • /usr/lib/systemd/
  • /etc/systemd/

など locate で探すと結構たくさんあってどうなってるのか面食らう。なので役割分担と、優先順位について学んでおいたほうが良さそうだ。

/lib/systemd/

systemd のファイルは基本的に /lib/systemd/に置かれる。

おもに、起動するサービスやジョブとターゲットの各記述がここに置かれている。

/usr/lib/systemd/ には pkgインストールしたモノを置くようだ。

/lib/usr/libLinuxのFHSファイルシステムレイアウトに従うと考えて問題なさそう。

FHSに従うので、ディストリが使うのが /lib 。一方でユーザ全体で使うのが /usr/lib ってことになる。個人ユーザーは /home/を使う。 *1

Debianだと /usr/lib/systemd/ の中身は /lib/systemd へのaliasになってる。

次のように、 path.targets などターゲットは /lib/systemd/の該当部分へのエイリアスになっている。

takuya@:~$ ll -ls /usr/lib/systemd/*
/usr/lib/systemd/catalog:
合計 52K
12K -rw-r--r-- 1 root root 9.7K 2017-01-05 08:42 systemd.catalog
12K -rw-r--r-- 1 root root  10K 2017-01-05 08:42 systemd.fr.catalog
12K -rw-r--r-- 1 root root 9.2K 2017-01-05 08:42 systemd.it.catalog
16K -rw-r--r-- 1 root root  14K 2017-01-05 08:42 systemd.ru.catalog

/usr/lib/systemd/network:
合計 0

/usr/lib/systemd/ntp-units.d:
合計 4.0K
4.0K -rw-r--r-- 1 root root 26 2017-01-05 08:42 90-systemd.list

/usr/lib/systemd/user:
合計 20K
4.0K -rw-r--r-- 1 root root 457 2017-01-05 08:42 basic.target
   0 lrwxrwxrwx 1 root root  36 2017-01-05 08:42 bluetooth.target -> /lib/systemd/system/bluetooth.target
4.0K -rw-r--r-- 1 root root 414 2017-01-05 08:42 default.target
4.0K -rw-r--r-- 1 root root 499 2017-01-05 08:42 exit.target
4.0K -rw-r--r-- 1 root root 166 2015-01-04 02:42 obex.service
   0 lrwxrwxrwx 1 root root  32 2017-01-05 08:42 paths.target -> /lib/systemd/system/paths.target
   0 lrwxrwxrwx 1 root root  34 2017-01-05 08:42 printer.target -> /lib/systemd/system/printer.target
   0 lrwxrwxrwx 1 root root  35 2017-01-05 08:42 shutdown.target -> /lib/systemd/system/shutdown.target
   0 lrwxrwxrwx 1 root root  36 2017-01-05 08:42 smartcard.target -> /lib/systemd/system/smartcard.target
   0 lrwxrwxrwx 1 root root  34 2017-01-05 08:42 sockets.target -> /lib/systemd/system/sockets.target
   0 lrwxrwxrwx 1 root root  32 2017-01-05 08:42 sound.target -> /lib/systemd/system/sound.target
4.0K -rw-r--r-- 1 root root 497 2017-01-05 08:42 systemd-exit.service
   0 lrwxrwxrwx 1 root root  33 2017-01-05 08:42 timers.target -> /lib/systemd/system/timers.target

/usr/lib/systemd/user-generators:
合計 0

ただしCentOSなどは /usr/lib と /libの区別を無くす方向なのかな?それで /usr/lib を使うようになってるみたい。

/etc/systemd

ここにはLinuxの設定として設置される。 /usr/lib/systemd よりも優先される。 実際には、 /etc/systemd には /lib/systemd への alias も数多く置かれている。

つまり units(job/service/target)の実体は /lib/systemd だが、/etc/systemd だけをみてわかるようにおいているんだろうと考えて問題なさそう。

etc はその他に systemd で journal や system.conf などのsystemd の根幹の設定が置かれているのが特徴かな。

ターゲットは /lib/systemd/system 由来のものを持ってきている。

takuya@:~$ ll -ls /etc//systemd/system

/etc//systemd/system:
合計 68K
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 bluetooth.target.wants
   0 lrwxrwxrwx 1 root root    9 2016-09-24 03:52 corosync.service -> /dev/null
   0 lrwxrwxrwx 1 root root   37 2016-06-13 22:10 dbus-org.bluez.service -> /lib/systemd/system/bluetooth.service
   0 lrwxrwxrwx 1 root root   40 2016-06-13 22:10 dbus-org.freedesktop.Avahi.service -> /lib/systemd/system/avahi-daemon.service
   0 lrwxrwxrwx 1 root root   40 2016-06-13 22:10 dbus-org.freedesktop.ModemManager1.service -> /lib/systemd/system/ModemManager.service
   0 lrwxrwxrwx 1 root root   53 2016-06-13 22:10 dbus-org.freedesktop.nm-dispatcher.service -> /lib/systemd/system/NetworkManager-dispatcher.service
   0 lrwxrwxrwx 1 root root   35 2017-03-16 16:16 display-manager.service -> /lib/systemd/system/lightdm.service
4.0K drwxr-xr-x 2 root root 4.0K 2016-11-05 15:35 getty.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2017-03-16 15:48 graphical.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 halt.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 hibernate.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 hybrid-sleep.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:11 local-fs.target.wants
4.0K -rw-r--r-- 1 root root  303 2016-10-29 16:04 mgetty.service
4.0K drwxr-xr-x 2 root root 4.0K 2017-03-16 22:14 multi-user.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 paths.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 poweroff.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 printer.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 reboot.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-11-09 19:05 sockets.target.wants
   0 lrwxrwxrwx 1 root root    9 2016-09-24 03:51 spiceproxy.service -> /dev/null
   0 lrwxrwxrwx 1 root root   31 2016-06-13 22:10 sshd.service -> /lib/systemd/system/ssh.service
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 suspend.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:11 sysinit.target.wants
   0 lrwxrwxrwx 1 root root   35 2016-06-13 22:10 syslog.service -> /lib/systemd/system/rsyslog.service

優先度

あとのほうが優先。

  • /lib/systemd/system/
  • /usr/lib/systemd/system/
  • /etc/systemd/system/

あとのものと先のもので同名がアレば、上書きされるとのこと。

参考資料

http://enakai00.hatenablog.com/entry/20130917/1379374797

*1:後述するが systemd はユーザー毎のユニットが存在する。

systemdでsysVinit/Upstart系のコマンドはどうなるの?

upstart 系のものはどうなるの?

takuya@:systemd$ ls -l /sbin/{start,reload,stop,restart,status}
ls: /sbin/start にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/reload にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/stop にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/restart にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/status にアクセスできません: そのようなファイルやディレクトリはありません

以前は

takuya@atom:~$ ls -l /sbin/{start,reload,stop,restart,status}
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/reload -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/restart -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/start -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/status -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/stop -> initctl

のようにコマンドはありました。今は見当たりません。

UpStart の知識は忘れたほうが良さそうです。service コマンドは残りそう

/etc/init ディレクト

以前は、/etc/init ディレクトリに upstart のジョブは置かれていました。また /etc/init.d はそのまま使えます。

いまでもなぜかssh.conf が私の環境には残っていました。これどっちで起動してるんだろう。。。

takuya@: $ cat /etc/init/ssh.conf
# ssh - OpenBSD Secure Shell server
#
# The OpenSSH server provides secure shell access to the system.

description     "OpenSSH server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5
umask 022

env SSH_SIGSTOP=1
expect stop

# 'sshd -D' leaks stderr and confuses things in conjunction with 'console log'
console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
# 'exec' line here instead
exec /usr/sbin/sshd -D

rc にも残ってるだけどね。

takuya@:~$ ll /etc/rc5.d/ | grep ssh
33:lrwxrwxrwx 1 root root  13 2016-06-14 03:00 S03ssh -> ../init.d/ssh

どうやら、systemd の設定で起動しているようです。余り何も考えなくて良いのは楽ですね。

takuya@:systemd$ systemctl  status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
   Active: active (running) since 土 2017-04-29 01:07:24 JST; 5 days ago
 Main PID: 1029 (sshd)
   CGroup: /system.slice/ssh.service
           ├─  399 /bin/bash
           ├─  445 vim .bash_aliases
           ├─ 1029 /usr/sbin/sshd -D
           └─32630 /bin/bash
takuya@:~$ cat /lib/systemd/system/ssh.service
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=sshd.service

アップデートでファイルは残ったけど、そのへんはうまくやってると信じることにする。

Upstartは使えなくなるけど、 /etc/init に書いてたようなノノはそのまま使えるわけだ。助かる。