- 投稿日:2019-05-03T22:31:07+09:00
【Apache】困った、困ったApacheの再起動に失敗したらときと、ゾンビちゃんを一網打尽にする方法
概要
みなさんはこんな経験ないですか?
# /etc/init.d/httpd restart httpd を停止中: [失敗] httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xx.xx for ServerName (98)Address already in use: make_sock: could not bind to address [::]:80 (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable to open logs [失敗]apache再起動したいけど、できないざますー!!!
そんな時はこのコマンドを叩いてみましょう
httpdのプロセスが ざわついていませんか? ざわざわっ$ ps auxw | grep httpd user 24484 0.0 0.3 285604 13060 ? S Jan01 0:08 /usr/sbin/httpd user 24485 0.0 0.3 285604 13048 ? S Jan01 0:08 /usr/sbin/httpd user 24486 0.0 0.3 285604 13044 ? S Jan01 0:08 /usr/sbin/httpd上記は、通常の状態ですが、起動時間がやたら長いのがいたり、ユーザーが?????とかよくわからん
プロセスがいたりして再起動に失敗している場合があります
怪しいプロセスがいた場合は下記コマンドを実行して、ゾンビちゃんを一網打尽にしましょう wkill -9 `ps auxw | grep httpd | awk '{print $2}'`解説
kill -9
はプロセスを強制終了します。
プロセスをキルするとか殺すとかいいますね。
ps auxw | grep httpd | awk '{print $2}'
こちらは httpdのプロセスの2要素目のリストを出力しています。
参考までにこのコマンドだけ実行すると↓のようになります$ ps auxw | grep httpd | awk '{print $2}' 1633 9901 24484 24485 24486結論
要はhttpdのプロセスを全部killしているだけです。
実行する際は、webを参照しているユーザもいるかもしれないので、
えいやー!!! ではなく、関係各所やタイミングを図りましょうwそれではよい Linux Apache ライフを!!
- 投稿日:2019-05-03T21:16:13+09:00
Arch Linux を触り始めた感想を簡単にまとめる
はじめに
趣味がてら、Arch Linux を数日あれこれ触ってみていました。
初めて触る Linux だったこともあり、ハマることも多かったのですが、その過程が楽しいなと感じました。
この記事では、Arch Linux を触り始めて感じたことをまとめてみようと思います。
経緯
普段仕事で使っているのは Mac なのですが、少し気分を変えてみたいなと思い、Linux 環境を立ち上げてみようと思い立ちました。
Ubuntu や CentOS は多少触ってきたことはあったので、それをもう一回触るのもなんだかなと思っていました。
そこで、どうせならあまり触ったことがない Linux をいじってみようということで探していたところ、Arch Linux が良さそうだったので、VirtualBox 上で触ってみることにしました。
Arch Linux を選んだ理由
Arch Linux の設計哲学が魅力的だったのが大きいです。
以下、Arch Linux - ArchWiki から抜粋します。
Arch Linux は、軽量、柔軟、シンプル、および UNIX ライクであることを目指しています。インストールでは x86-64 用にコンパイルされた最小限 (非GUI) の環境が提供され、不必要なパッケージは含まれません。ユーザーは不要な、あるいは迷惑なパッケージを削っていくのではなく、あらかじめ選択されたデフォルトなどのない最小構成からシステムを作り上げることができます。Arch の設計哲学および実装は、最小構成のコンソールマシンから壮大で機能豊富なデスクトップ環境まで、要求されたいかなる種類のシステムへの拡張をも容易にします。どんな Arch システムにするかはユーザーが決めるのです。
上記の様に、最小構成から必要なもののみインストールしていくということで、不要なものは切り捨てて軽い状態にできるというところに惹かれました。
というのも、Mac を触っている中で、どうしても動作が重くなってしまうシーンがあったので、最小構成で環境を組んだらどんな体験ができるのだろう?という技術的興味が湧きました。
また最近 UNIXという考え方―その設計思想と哲学という本を読んでいて、UNIX 哲学にも興味が湧いていたので、UNIX ライクと謳っている Arch Linux を触ることを通じて、UNIX 哲学を学ぶこともできそうだというところも魅力的でした。
Arch Linux を触り始めて感じたこと
ここからは Arch Linux を触り始めて感じたことをつらつら書いていこうと思います。
Linux に関する理解を深められる
最近の Linux はインストールが非常に簡単にできるようになってきていると思います。しかし Arch Linux の場合は、ディスクのパーティションを切るところから自分でコマンドを実行しながらインストールを進めなければなりません。
以下のインストールガイドを見ると、パーティションを切って、ファイルシステムを準備して、ネットワークを疎通して、というように、すべて手動でインストール作業を進める形となっています。
一見面倒ではあるのですが、Linux に関する理解を深めるということを目的に置くと、自分でインストール作業を実施することはとても勉強になるなと感じました。
自分好みに環境をカスタマイズするモチベーションが湧く
Arch Linux を最小構成でインストールしたあとは、CUI しかなく、デスクトップ環境すらありません。
最初はとても普段使いできる状態ではなく不便なのですが、そこから試行錯誤しながら徐々に自分好みの環境にカスタマイズしていくという過程が楽しいなと感じました。
例えば Mac で何気なく使っていたダークモードっぽいデスクトップにしようと思ったとき、Arch Linux にはそもそもデスクトップ環境自体がないため、
- デスクトップ環境を何を使って立ち上げる?GNOME?KDE?Xfce?
- デスクトップのテーマ何にする?
- デスクトップの壁紙何にする?
- ...
というふうに、ゼロから自分の理想の形を必然的に考えていくことになります。
仕事中だとフラストレーションが溜まる状況になりがちですが、自由な時間に自由な発想で考えていくのは楽しいなと感じました。
また UNIXという考え方―その設計思想と哲学には、「好みに応じて自分で環境を調整できるようにする」という一節がありますが、Linux はすべての設定を制限なくカスタマイズできる自由が存在します。
「この設定、どう変更するのだろう?」ということをあれこれ調べていくのも楽しいなと思いました。
おわりに
もし Arch Linux を触り始めようと思っている方は、まずインストールガイド - ArchWikiを読むことから始まると思います。
僕もまだ入門したてで、まだ触り始めて間もないですが、いずれ仕事でも使えるような環境に育てていけるよう、試行錯誤を続けていこうと思います。
- 投稿日:2019-05-03T18:39:50+09:00
mount コマンドを使わないでマウント一覧を確認する方法
背景
普段、マウント状況を確認するのに素の
mount
コマンドを一発かまして確認していたのですが、どうもこの結果と実際が一致しないとういう状況に遭遇しました。シェルスクリプトの中でも使っているため、その信頼性が揺らぐことがあるならば少々問題では、ということでちょっと調べてみました。
※ CentOS6 系の環境で確認
※ 先に答えを言うと→cat /proc/mounts
マウント、アンマウント実行時
実は、マウント(mount …)を実行した際に、
/etc/mtab
というファイルに「~をマウントしてます」という情報を追記しています。
また、逆にアンマウント(umount …)した際には、/etc/mtab
から該当のマウント情報を削除しています。で、 素の
mount
コマンドを実行した際には、この/etc/mtab
の内容を少々加工して表示するようになっています。$ cat /etc/mtab /dev/sda3 / ext4 rw 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 devpts /dev/pts devpts rw,gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs rw 0 0 /dev/sda1 /boot ext4 rw 0 0 $ mount /dev/sda3 on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) /dev/sda1 on /boot type ext4 (rw)マウントしていたものにアクセスできなくなったとき
例えば、NFS でマウントしていたものの、接続先のサーバが落ちてマウントされていない状態になった場合、
umount …
を実行していないので/etc/mtab
に残ったままになってしまいます。では、
umount …
を実行することで削除されるかというと、実際にはマウント状態になっていないのでumount: …: 見つかりません
と拒否られてしまいます。※ NFS のマウントオプションにより挙動が変わる可能性があるかもしれません
再度 mount コマンドを発行するも…
再度 NFS でマウントした場合には、すでに
/etc/mtab
に記載されており、対象へアクセスが可能になるだけで/etc/mtab
は更新されないだろう、と思いきや、新たにマウント情報が追記されてしまいます。この状態で
umount …
を発行した際にすべてきれいになるかというと、これまた期待を裏切られて新たに追記されたものだけが削除されてしまい、いつまでも整合性がとれない事態に陥ってしまいます(´・ω・`)。さらば、/etc/mtab よ!
/proc/mounts
【参考】https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-mounts)$ cat /proc/mounts rootfs / rootfs rw 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 devtmpfs /dev devtmpfs rw,relatime,size=759524k,nr_inodes=189881,mode=755 0 0 devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 /dev/sda3 / ext4 rw,relatime,barrier=1,data=ordered 0 0 /proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0 /dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
/etc/mtab
を加工してどうにかできないのものかと調べていたところ、この/proc/mounts
がリアルタイムに現在のマウント情報を反映していることがわかったため、素のmount
コマンドをたたくことでマウント一覧を確認する方法を手放すことにしました。
/etc/mtab
を加工するまでもなかったですね。また、不整合が発生する可能性があるなら、最初から
/etc/mtab
を更新しないようmount
コマンドの-n
オプションを指定してマウントした方がいいのかもしれませんね。$ man mount … -n, --no-mtab Mount without writing in /etc/mtab. This is necessary for example when /etc is on a read-only filesystem. …
- 投稿日:2019-05-03T12:01:33+09:00
Pythonコード補完ソフトKite、ついにLinuxサポート追加
Kiteは、数週間前@KeisukeToyotaさんもこの記事で話していた、Pythonのスマートコード補完や参考書検索ができるツールです。もともとWindows、macOSにてPyCharm、VS Code、Vim、Sublime、Atomなどのエディタで使えますが、今日持ってLinuxサポートも追加したようです。
具体的な情報は公式サイトの発表記事まで。Ubuntu、Fedora、Arch Linux、Linux Mint、openSUSEなど、色々なLinuxで使えると言っています。デスクトップはKDE、XFCE、Gnome 2・3どれでもオーケーのようです。
数年前からLinuxサポートを約束していたので、ついに発表されて嬉しいです。
Kiteのダウンロードは公式サイトから。上の@KeisukeToyotaの記事にインストール手順が書いてあります。是非試して見ましょう。
- 投稿日:2019-05-03T11:53:16+09:00
CentOS7でlocaleを日本語にしたい(「can't set the locale; make sure $LC_* and $LANG are correct」って怒られたときの解決方法)
こうゆう設定ってすぐ忘れちゃうよね
いつも調べ直しちゃいます。なので、備忘録として残す。
経緯
can't set the locale; make sure $LC_* and $LANG are correct
って怒られたので設定しました。
最初にやっとくべき設定ですね。現在のロケールを確認
localectl出力System Locale: LANG=en_US.UTF-8 VC Keymap: us X11 Layout: n/a
ja
になってません。en
だって。つまり日本のじゃない。日本語のロケールをインストール
日本語のロケールがあるか確認
localectl list-locales | grep -i jaなかった(゜゜)
ので、インストールする
sudo yum -y install glibc-common確認
localectl list-locales | grep -i ja出力ja_JP ja_JP.eucjp ja_JP.ujis ja_JP.utf8 japanese japanese.euc
ja
があるので良さそう。日本語のロケールを設定
なので、以下のようにコマンド打ちましょ
localectl set-locale LANG=ja_JP.UTF-8これだけじゃ反映しませんので、以下で反映させる
source /etc/locale.conf
設定の確認
localectl出力System Locale: LANG=ja_JP.utf8 VC Keymap: us X11 Layout: n/aおっけい
おわり
- 投稿日:2019-05-03T02:22:13+09:00
LDAPで快適Linux環境 #4 LDAPアカウントでログイン
前回はアカウント情報をLDAPサーバーに登録しました。今回は、クライアントからサーバー上のアカウントにログインしてみます。
ここからはクライアントでの作業です。
まず、必要なパッケージをインストールします。root@deb:~# apt install libnss-ldap libpam-ldap ldap-utils nscd nslcd
すると、自動設定が走ります。
親切なことに案内が日本語なので、それに従って設定していきます。
再設定したいときは、dpkg-reconfigure
を走らせます。設定ファイルをいじっていきます。
/etc/nsswitch.conf#追記 passwd: compat ldap group: compat ldap shadow: compat ldap/etc/pam.d/common-password#26行目"use_authtok"を削除する password [success=1 user_unknown=ignore default=die] pam_ldap.so try_first_passそして運命の再起動。
設定ミスがあるとログインで無限ループします。レスキューモードで頑張りましょう。
うまくいっていると、ログイン画面が出てきます。ここでLDAPアカウントにログインしようとしてできないのは正常です。ホームディレクトリが存在しないからです。
ローカルユーザーでログインして、su -
でログインしてみましょう。または、GUIでなくCUIでならいきなりLDAPアカウントにログインできます。
ホームディレクトリが無いので"HOME=/"でログインされますがそれで成功です。次回は、NFSサーバーの設定をしていきます。
- 投稿日:2019-05-03T01:58:08+09:00
pwdコマンドについて調べてみました!
pwd
コマンドとは!?
- 基本的なコマンドなので、私なりに調べてみました
- カレントディレクトリを表示するコマンドです
pwd
は print working directory の略です- 実行してみましょう!
$ cd /tmp/ $ pwd /tmp
- カレントディレクトリが表示されましたね!!
- いかがでしたか? 参考になったら左上の「いいね」ボタンを押してください!
マニュアルを引いてみる
- どんなコマンドでもマニュアルがあります
- OSがRHEL系だとCoreutilsのマニュアルが出てくるはずです
- BSD系でも大差ないでしょう
- とか書くと面倒なおっさんに突っ込まれるのでfreeBSDのマニュアルも見てみましょう
RHEL Coreutils版
Coreutils 8.31での
man pwd
の抜粋です。PWD(1) User Commands PWD(1) NAME pwd - print name of current/working directory SYNOPSIS pwd [OPTION]... DESCRIPTION Print the full filename of the current working directory. -L, --logical use PWD from environment, even if it contains symlinks -P, --physical avoid all symlinks --help display this help and exit --version output version information and exit If no option is specified, -P is assumed. NOTE: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.まず分かることは
- -Lと-Pというオプションがある
- -L はシンボリックリンクを表示する (logical)
- -P はシンボリックリンクをたどって物理的(physical)なパスを表示する
- オプションが指定されなければ、 -P の挙動になる
- --help , --version というオプションがある
freeBSD
マニュアルを抜粋してみます
pwd(1)
1PWD(1) BSD General Commands Manual PWD(1) NAME pwd -- return working directory name SYNOPSIS pwd [-L | -P] DESCRIPTION The pwd utility writes the absolute pathname of the current working directory to the standard output. Some shells may provide a builtin pwd command which is similar or identi- cal to this utility. Consult the builtin(1) manual page. The options are as follows: -L Display the logical current working directory. -P Display the physical current working directory (all symbolic links resolved). If no options are specified, the -P option is assumed.
- -L, -Pのオプションがあります。デフォルトは -P です
- 以下、RHEL環境(CentOS 6.10)で実施
実行してみる
シンボリックリンクを作成して挙動を見てみましょう。ディレクトリを作って、シンボリックリンクのディレクトリに入ってオプションの違いを示します。
$ cd /tmp $ mkdir dir $ ln -s dir sym-dir $ cd sym-dir/ $ pwd -L /tmp/sym-dir # シンボリックリンクのディレクトリが表示されている $ pwd -P /tmp/dir # 実体のディレクトリが表示されているおっと忘れてた。デフォルトの挙動をチェックしてみましょう。
# pwd /tmp/sym-dir本来 -P の結果が出るはずなんですが、シンボリックリンクである -L の結果が出ています。
環境依存の
pwd
あやしいな・・・本当にバイナリあってるの?ってことで調べてみます。
$ which pwd /bin/pwd実行してるバイナリはあってそう。
確認のために--help
してみます。$ pwd --help -bash: pwd: --: invalid option pwd: usage: pwd [-LP]なんでや!エラーになるぞ!
エラーの内容をよく見てください。-bash:
はい、お分かりの通りbashの組み込みコマンド(shell builtin)です。
組み込みコマンドというのはshellに予め仕込まれてるコマンドです。
help
コマンドで一覧を見ることができます。実行していたコマンドが組み込みコマンドだったのか確かめてみます。$ type pwd pwd is a shell builtin予想どおりシェルの組み込みコマンドが実行されていたのでした。期待通りのコマンドの結果を得るためには絶対パスでpwdを叩いてやります。他のやり方としては、aliasを貼るか、
env pwd
とします 2 。$ /bin/pwd -L /tmp/syn-dir $ /bin/pwd -P /tmp/dir $ /bin/pwd /tmp/dir期待通りの結果が返ってきました。よかったね
トリビア:シェル組み込みコマンドのechoとGNU Coreutilsのecho はオプションが(ほぼ)同じなので互換性があります 3
発端
技術書典6にサークル参加していました。サークル参加しての感想はこちらに書きました:技術書典6 振り返り
売り子をしていたら新刊の「解説CoreUtils第7版」の
pwd
のデフォルト値違うよ!という指摘を受けました。動作確認ついでに調べてみました!っていうのが本記事です。さらなる展開
一緒に売り子していた人にその事実を伝えると、最新版のPOSIXの仕様に矛盾していることが判明しました。
The Open Group Base Specifications Issue 7, 2018 edition
のサイトでpwdコマンドを確認してみましょう 4 。If both -L and -P are specified, the last one shall apply. If neither -L nor -P is specified, the pwd utility shall behave as if -L had been specified.
-L がデフォルトですね。
先程触れたcoreutilsのweb版のマニュアルは引用はわざと中途半端なところで切っていました。一文まるまる抜き出してみるとこのようになっています5。
If -L and -P are both given, the last one takes precedence. If neither option is given, then this implementation uses -P as the default unless the POSIXLY_CORRECT environment variable is set.
_人人人人人人人人人_
> POSIXLY_CORRECT <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄POSIXLY_CORRECT
この変数に、何かを設定してやればPOSIXに準拠するようです。やってみましょう。
$ /bin/pwd /tmp/dir $ POSIXLY_CORRECT=1 /bin/pwd /tmp/sym-dir $ /bin/pwd -L /tmp/sym-dir-L と同じ挙動になりましたね!いかがでしたか?こんな事実を知らなくても生きていけますね!
参考にならなかったら右上のいいねボタンを押してください!!宣伝タイム
- そんなコマンドの細かいオプションを解説した「解説CoreUtils第7版」はPDF版でも販売中:解説CoreUtils第7版 - gumroad
- この本を出したあとに指摘を受けて本記事を書きました。上記の本には載ってませんがいつかこの事件が収録されます
- 物理媒体(本)は通販で販売中:COMIC ZIN 通信販売/商品詳細 解説CoreUtils第7版
- 買ってくれると筆者のご飯になります(割とマジで)
参考
- pwd コマンドは $PWD 変数と密接に関わっているのでマニュアルを読んでみましょう。POSIXのマニュアルも参考になるかもしれません
- シェルの組み込みコマンドを調べるには
- ビルトインコマンドについてはこちらも参照
https://www.freebsd.org/cgi/man.cgi?query=pwd&apropos=0&sektion=1&manpath=FreeBSD+13-current&arch=default&format=html ↩
https://stackoverflow.com/questions/29540540/how-do-i-prevent-bash-to-use-a-builtin-command ↩
sh,bashではオプションが一致。ただしzshでは少しだけ拡張してある ↩
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pwd.html ↩
https://linuxjm.osdn.jp/info/GNU_coreutils/coreutils-ja_15.html ↩