Linuxで自作のプログラムなどをデーモン化して/var/logにログ出力する

デーモン化

使いたいスクリプトなどを準備する。
次に /etc/systemd/system/ にファイルを作成。
ファイル名は hoge.survice とする。

[Unit]
Description = hoge daemon
After = local-fs.target network-online.target
ConditionPathExists = /usr/local/bin

[Service]
ExecStart = /usr/local/bin/hoge
Restart = always
Type = simple

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=hoge

[Install]
WantedBy = multi-user.target

大体の設定はファイルを見ればなんとなく分かりそう。 プログラムによっては先に何かが起動していないと失敗するものも多くあると思う。
[Unit]内のAfterはそのようなプログラムの為にある。
デーモン化したい場合、何かエラーがおきても再起動して欲しいので、[Service]のRestartはalwaysにしておく。

次にログ出力はここで指定。

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=hoge

ログ用の設定ファイルを作成

/etc/rsyslog.d/hoge.conf のようなファイル名で作成。
ファイル内で先ほどのSyslogIdentifierを使ってログを設定。

if $programname == 'hoge' then {
    action(type="omfile" file="/var/log/hoge.log")
}

これで

sudo systemctl enable hoge.service

をすれば登録されるので次回の起動時から動くはず。 ログは /var/log/hoge.log に出力される。

ブロックチェーンアプリケーション開発の教科書を読んでいて少し戸惑ったところ 1

ブロックチェーンアプリケーション開発の教科書

ブロックチェーンアプリケーション開発の教科書

最初の取っ掛かりとして分かりやすい本ぽいが、Ethereumも開発が進んでいるので少し違うところもありそう。 気になったところの備忘録として書いておく。

今回気になったのは Web IDEのRemixの画面。 http://remix.ethereum.org の画面がおそらく前と変わっているのでp.165の実行手順に少し迷った。

右側の[Run]タブから[Create]ボタンをクリックと書いてあるが、[Create]ボタンがない。 現時点(2018年12月27日)では[Deploy]というボタンがあるので、そこをクリック。 下にget, setが現れるところは変わらない。

ImageMagickでOrientationを操作して画像の向き自分の望み通りにする

自分の思ったような向きにならないことがあったのでメモ。

まずはImageMagickを使って -strip でExif削除するケースの場合。 削除後に見ると表示して欲しい方向とは違う感じで表示されてしまった。

$
$ identify -verbose hoge.jpg | grep Orientation
  Orientation: RightTop
    exif:Orientation: 6
$
$ convert hoge.jpg -strip hoge_after.jpg
$
$ identify -verbose hoge_after.jpg | grep Orientation
  Orientation: Undefined
$

次に -auto-orient を試してみた。 これが自分の望む動作になった。

$
$ mogrify -auto-orient hoge.jpg
$
$ identify -verbose hoge.jpg | grep Orientation
  Orientation: TopLeft
    exif:Orientation: 1
$

リサイズで -thumbnail を使っているとexif情報は削除されるようだ。 実行してみたところ、生成された画像はやはり自分の希望する方向ではなかった。

$
$ convert hoge.jpg -thumbnail 640x640 hoge_thumb.jpg
$
$ identify -verbose hoge_thumb.jpg | grep Orientation
  Orientation: Undefined
$

リサイズで自分の欲しい向きにするには -auto-orient -resize の2つを使うのがいいみたい。 これで自分のやりたいことが出来た。

$
$ convert -auto-orient -resize 640x640 hoge.jpg hoge_resize.jpg
$
$ identify -verbose hoge_resize.jpg | grep Orientation
  Orientation: TopLeft
    exif:Orientation: 1
$

PHPでSFTPを使う

個人的にあまりやりたくないですが、こういうファイルサーバーにアクセスして何かするみたいなのが必要な時もあるということで。
まずSFTPはSSHが必要です。
https://ja.wikipedia.org/wiki/SSH_File_Transfer_Protocol

PHPの場合、拡張モジュールが必要なので、インストールされていない場合はインストールします。
http://php.net/manual/ja/book.ssh2.php
インストール出来ればあとはコーディングです。 下のサンプルでなんとなく雰囲気は分かるかなと思います。

$connection = ssh2_connect('sftp-server', 22);

if (!$connection) {
    echo('接続エラー');
}
if (ssh2_auth_password($connection, 'user', 'pass')) {
    $sftp = ssh2_sftp($connection);
} else {
    echo('認証エラー');
}

// ファイル名を取得して出力してみる
$handle = opendir("ssh2.sftp://{$sftp}/root");
while (false != ($entry = readdir($handle))){
    echo($entry . PHP_EOL);
}

fishでbashの$(command)をやる

最近になってfishを使い始めた。
そんな中aws-cliとか使っていてAWSに言われたまま動かなかったコマンドがこちら

$(aws ecr get-login --no-include-email --region ap-northeast-1)

bashzshではこれという事で、何も考えずにコピペしたのだが動かず。 fishではevalなんですね。

eval (aws ecr get-login --no-include-email --region ap-northeast-1)

で実行可能。

Gmailのサーバーを使ってメールを送る為にSMTP Relayで設定したが送れない時

具体的に言うと、/var/log/maillog に以下のような警告とエラーが出てる時

warning: SASL authentication failure: No worthy mechs found
SASL authentication failed; cannot authenticate to server smtp.gmail.com[108.177.125.109]: no mechanism available

他の設定は問題ないのにこれが出て送れない場合、

yum install cyrus-sasl-plain

で送れるようになることが多いはず