20211124のLinuxに関する記事は5件です。

findコマンドで一部のディレクトリを除外した際に得た理解

findコマンドで一部のディレクトリを除外するためにpruneというオプションを利用した。このときに得た理解をメモしておく。 「find ディレクトリ 除外」で検索するとfindコマンドとpruneオプションを利用したテクニックが手に入る Googleで「find ディレクトリ 除外」などで検索するとpruneオプションを利用したコマンド例が挙がってくる。 #「test-」から始まるディレクトリを除外し、一覧する find . -type d -name "test-*" -prune -o -print 実行例を検証 実行は前提としてこのようなディレクトリ構成を想定し実行している そして、findコマンドを実行してみる。 $ find . -type d -name "test-*" -prune -o -print . ./file2.txt ./file1.txt ./hoge-dir1 ./hoge-dir1/file2.txt ./hoge-dir1/file1.txt ./hoge-dir2 ./hoge-dir2/file2.txt ./hoge-dir2/file1.txt ./hoge-dir3 ./hoge-dir3/file2.txt ./hoge-dir3/file1.txt 確かに、test-*から始まるディレクトリが除外された一覧が取得出来る。 新しい疑問 「-o -print」って何だ このとき、「findコマンドでpruneオプションを利用すれば、特定のディレクトリが除外できるんだ!」と理解したのだが、新しい疑問が生まれ混乱した。「-o -printオプション」はなんで必要なんだ。 prune オプションは除外するオプションではない 結果的にはpruneオプションを利用することで要求を解決出来るのだが、この時に「pruneオプションは、除外するためのオプション」という理解をするのは混乱を招く。 前提 以下のような構成のディレクトリを前提に話を進めている。 $ tree . ├── file1.txt ├── file2.txt ├── hoge-dir1 │   ├── file1.txt │   └── file2.txt ├── hoge-dir2 │   ├── file1.txt │   └── file2.txt ├── hoge-dir3 │   ├── file1.txt │   └── file2.txt ├── test-dir1 │   ├── file1.txt │   ├── file2.txt │   ├── test-dir1 │   │   ├── file1.txt │   │   ├── file2.txt │   │   ├── test-file1.txt │   │   └── test-file2.txt │   ├── test-file1.txt │   └── test-file2.txt ├── test-dir2 │   ├── file1.txt │   ├── file2.txt │   └── test-dir │   ├── file1.txt │   ├── file2.txt │   ├── test-file1.txt │   └── test-file2.txt └── test-dir3 ├── file1.txt ├── file2.txt └── test-dir3 ├── file1.txt ├── file2.txt ├── test-file1.txt └── test-file2.txt pruneオプションは真を返す findコマンドでpruneオプションを付加した場合、条件に該当するモノを見つけ結果として真を返す。 それがディレクトリだった場合は、そのディレクトリのより下の階層の検索は行わない。この動作を枝刈り、枝切り、枝探し、切り取りと表現していて、pruneの動詞的な意味なんだと理解出来る。 実行例 実際にコマンドを実行してみると、以下のような結果が得られる。 $ find . -type d -name "test-*" -prune ./test-dir1 ./test-dir2 ./test-dir3 findは結果が真だった場合、その対象を標準出力にパス付きで表示するようになっているらしい。そのため、「test-」から始まる3つのディレクトリは結果が真となり出力される。さらにこれらのディレクトリの中には「test-」から始まるディレクトリが含まれているが、pruneオプションによって真となったディレクトリより下のディレクトリは検索しないという動作になる為それらは出力(検査)されない。 -o はORの意味 findコマンドを利用する際に複数の条件を論理和として評価したい場合に使う。 はい、でしょうね。知ってました。で、何故それが必要なのか。そして右辺で-printする理由。その結果特定のディレクトリを除外した結果が得られるのか。 -print は標準出力への結果出力 findでは結果が真となったファイルやディレクトリをパス付きで標準出力に出力すると説明は実は言葉足らず。この動作は−printなどのオプションがfindコマンドに指定されていない場合の話。 今回のコマンド構成の場合、-oオプションの右辺に-printが指定されているため、左辺の結果に対する出力が行われないことになる。右辺の真に対してのみ出力が行われる。 -pruneオプションによって結果が除外されるのはなぜ 今回のコマンドの構成を改めて確認して見る。 #「test-」から始まるディレクトリを除外し、一覧する find . -type d -name "test-*" -prune -o -print # ~~~~~~左辺の条件~~~~~~ ~~~~~~右辺の条件~~~~~~ 左辺の条件  -type d -name "test-*"この条件を満たしたファイルは真となる。 右辺の条件 何もない、要は無条件。 短絡評価ってことか ORで繋がれた二つの条件がある場合、一つ目の条件が真である場合二つ目の評価をする必要がない。だから二つ目を評価しない 要するに、左辺の条件を満たファイルはpruneオプションによって真となる。その為、右辺の処理がされないことになる。printオプションは右辺にあるため、右辺を評価しない場合は出力されないことになる。 左辺の条件を満たさなかった場合はどうなるかというと、右辺の条件が評価される。 しかし、右辺には条件がない->要するに無条件。無条件で-printされることになる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

chronyd覚書

chronydとは chronydデーモンは、カーネルで実行されているシステムクロックを調整します。 調整は、NTPプロトコルを使用して外部のタイムソースを参照することで行われます。 外部参照が使用できない場合、chronydはドリフトファイルに格納されている最後に計算された情報を使用します。 chronycコマンド chronyデーモンは、コマンドラインユーティリティchronyc によって制御できます。 このユーティリティは、chronydに変更を加えるためにいくつかのコマンドを入力できるコマンドプロンプトを提供します。 デフォルトの設定では、chronydはchronycのローカルインスタンスからのコマンドのみを受け入れますが、chronycを使用して構成を変更し、chronyd が外部制御を許可するようにすることができます。 chronyのインストール # rpm -qa | grep chrony chrony-2.1.1-3.el7.x86_64 # yum update chrony Loaded plugins: amazon-id, rhui-lb, search-disabled-repos Resolving Dependencies --> Running transaction check ---> Package chrony.x86_64 0:2.1.1-3.el7 will be updated ---> Package chrony.x86_64 0:2.1.1-4.el7_3 will be an update --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================= Package Arch Version Repository Size ============================================================================================================= Updating: chrony x86_64 2.1.1-4.el7_3 rhui-REGION-rhel-server-releases 281 k Transaction Summary ============================================================================================================= Upgrade 1 Package Total download size: 281 k Is this ok [y/d/N]: y Downloading packages: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/797a8b55-63bd-43ad-ebcb-daead2f9c588.png) Delta RPMs disabled because /usr/bin/applydeltarpm not installed. chrony-2.1.1-4.el7_3.x86_64.rpm Running transaction check | 281 kB 00:00:00 Running transaction test Transaction test succeeded Running transaction Warning: RPMDB altered outside of yum. Updating : chrony-2.1.1-4.el7_3.x86_64 1/2 Cleanup : chrony-2.1.1-3.el7.x86_64 2/2 Verifying : chrony-2.1.1-4.el7_3.x86_64 1/2 Verifying : chrony-2.1.1-3.el7.x86_64 2/2 Updated: chrony.x86_64 0:2.1.1-4.el7_3 Complete! # systemctl status chronyd chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2017-01-25 14:26:24 EST; 4min 36s ago Process: 6402 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS) Process: 6398 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 6400 (chronyd) CGroup: /system.slice/chronyd.service └─6400 /usr/sbin/chronyd Jan 25 14:26:24 RH73-1 chronyd[6400]: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PR...HASH) Jan 25 14:26:24 RH73-1 systemd[1]: Starting NTP client/server... Jan 25 14:26:24 RH73-1 chronyd[6400]: Frequency -13.214 +/- 0.044 ppm read from /var/lib/chrony/drift Jan 25 14:26:24 RH73-1 systemd[1]: Started NTP client/server. Jan 25 14:26:29 RH73-1 chronyd[6400]: Selected source 104.131.53.252 Hint: Some lines were ellipsized, use -l to show in full. 実行確認 # chronyc tracking Reference ID : 104.131.53.252 (104.131.53.252) Stratum : 3 Ref time (UTC) : Wed Jan 25 19:34:04 2017 System time : 0.000376487 seconds fast of NTP time Last offset : -0.000031977 seconds RMS offset : 0.000982537 seconds Frequency : 12.888 ppm slow Residual freq : +0.053 ppm Skew : 0.679 ppm Root delay : 0.014095 seconds Root dispersion : 0.021393 seconds Update interval : 65.1 seconds Leap status : Normal # Reference ID コンピュータが現在同期されているサーバーの参照ID と名前 (またはIPアドレス) です。 127.127.1.1の場合、コンピュータが外部ソースと同期されておらず、"local"モードが動作していることを意味します。 Stratum 階層 参照クロックが接続されているコンピュータから離れているホップ数を示します。 上記の例では、コンピュータは2ホップ離れています(コンピュータ自体を1階層として数えます)。 Ref time 参照時間 参照ソースからの最後の測定値が処理された時刻 (UTC) です。 System time システム時刻 報告される値は、以下の効果による差です。 通常の動作では、タイムスケールのジャンプは特定のアプリケーションプログラムに悪影響を及ぼす可能性があるため、chronydはシステムクロックをステップしません。代わりに、システムクロックのエラーは、エラーが取り除かれるまでシステムクロックをわずかにスピードアップまたは減速し、システムクロックの通常の速度に戻ることによって修正されます。 その結果、システムクロック(gettimeofday()システムコールを使用するプログラムが読み取る、またはシェルのdateコマンドによって読み取られる)が、chronyd の現在の実際の時刻の推定値と異なる期間が生じます(サーバーモードで動作している場合には、NTPクライアントに報告します)。 Last Offset 最後のオフセット 前回のクロック更新時の推定ローカルオフセットです。 RMS Offset RMSオフセット オフセット値の長期平均(Root Mean Square)です。 Frequency 周波数 「周波数」とは、chronydが時計を修正しなかった場合にシステムのクロックが間違っている速度です。 ppm(100万分の1)で表現されます。たとえば、値が 1ppmの場合、システムの時計が1 秒進んだと考えると、実際には実際の時刻に対して 1.000001秒進んだという意味になります。 freq 残存周波数 現在選択されている参照元の「残存周波数」が表示されます。 参照ソースからの測定値が、周波数を示す値と現在使用されている周波数との差を反映します。これが必ずしもゼロであるとは限らないのは、周波数にスムージング手順が適用されるためです。 基準ソースからの測定値が取得され、新しい残差周波数が計算されるたびに、この残差の推定精度が既存の周波数値の推定精度(次のスキューを参照)と比較されます。 新しい周波数の加重平均は、これらの精度に応じて重み付けで計算されます。基準ソースからの測定値が一貫した傾向に従う場合、残差は時間の経過とともにゼロに近づきます。 Skew スキュー 周波数の推定誤差です。 Root delay ルート遅延 コンピュータが最終的に同期される階層1コンピュータへのネットワークパス遅延の合計です。 Root dispersion ルート分散 すべてのコンピュータを通じて蓄積された総分散量です。分散は、システムクロックの分解能、統計的測定の変動などによって生じます。 Leap status うるう秒ステータス うるう秒ステータス。 関連情報
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gtk3アプリGtk.ListStoreを使ってコントロールを更新する

Gtk3アプリGtk.ListStoreを使ってコントロールを更新する Gtk.ListStoreを使いコントロールの更新を行います。 不特定の関数を作るのではなく、ListStoreのイベントハンドリングでまとめて更新をするとわかりやすくなります。 private Gtk.ListStore listStore1 = new Gtk.ListStore (typeof (testModel)); private void on_btn1_clicked(object sender , EventArgs e){ testModel testModel1 = new testModel(); testModel1.Name = "タイトル1"; testModel1.Description = "詳細1"; listStore1.Clear(); listStore1.AppendValues (testModel1); } private void _mkBining() { listStore1.RowChanged += delegate(object o, RowChangedArgs args) { ListStore testStore = ((ListStore)o); TreeIter iter; if (testStore.GetIter(out iter, args.Path)) { testModel testModel1 = (testModel)testStore.GetValue(iter, 0); Console.WriteLine("testModel1" + testModel1.icon_id ); titleEntry.Text = testModel1.Name; descriptionEntry.Text = testModel1.Description; } }; } ListStoreのRowChangedメソッドを使い、ListStoreが更新されたら他のコントロールを更新するようにします。 listStore1.RowChanged += delegate(object o, RowChangedArgs args) { ListStore testStore = ((ListStore)o); TreeIter iter; if (testStore.GetIter(out iter, args.Path)) { testModel testModel1 = (testModel)testStore.GetValue(iter, 0); } }; 続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linux-insides

linuxカーネルとその内部についての製作中の本です。 目標はシンプルです - Linuxカーネルの内部についての私の知識を共有すること、Linuxカーネル内部やその他の低レイヤーのことに興味のある人を助けることです。 質問/提案: 質問や提案は twitter @0xAX または email で連絡を取るか、 issue を作成することで気軽にしてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu 20.04 LTSでログイン画面が表示されなかったのを直した

事の始まり CentOS 8で運用していたPCのOSを,サポートが終了することに伴って,Ubuntuに入れ替えることになった. CentOSとマシンの相性か分からないが,フリーズしてしまうことも多く,電源を落とさざるを得ない場面もしばしばあった. 環境 ・AMD EPYC CPU 16core 7302 3.0GHz x 2 ・Ubuntu 20.04 LTS 起こったこと UbuntuのLiveUSB(ブータブルUSB)を作成し,それをマシンに差してUbuntuをインストールした. その後,再起動すると画面が真っ暗なままで,ログイン画面出てこなかった. とりあえず色々見てみた そのPCではCtrl + Alt + F1でGUI,Ctrl + Alt + F2~F6がCUIであった. Ctrl + Alt + F1を押すとGUIは出てくるが,ログインしようとしてEnterを押したり,マウスをユーザー名に重ねるとGUIが落ちてしまった.何度もやっているとフリーズしてどうにもならなくなる. CUIは問題なく起動し,ログインもできた.コマンドも実行できた. 先に結論 結論から言うと,以下の2点が原因であった可能性が高い. ログインの試行錯誤の過程で,電源ボタンで強制シャットダウンをしたことにより,GUI関連の重要なファイルであるxorg.confというファイルが壊れてしまったこと. これまで用いられていたX-windowというウインドウドライバから変更された,Waylandという新しいウインドウドライバが悪さをしていたこと. 今思えば,X-windowを使用しないのであれば2のみを解決すれば良かったのかもしれない. しかし,全く知識がない状態から調べまくって色々試したので,どれが効いたのか分からない. なので,以下では試した過程の全てを記載する. 1への対処法 真っ暗な画面で,Ctrl + Alt + F2~F6を押し,CUIでログイン. 以下で,gdm(gnome display manager)というパッケージを再インストール. $ sudo apt install ubuntu-desktop $ sudo apt install --reinstall gdm3 ubuntu-desktop gnome-shell 多分これでは直っていない. 次にXorg.confを修正する. まずはrootログイン. $ sudo su - その後,xorg.confが存在するかを確認する. # ls /etc/X11/xorg.conf これを入力してパスが出ればxorg.confが存在することになる. 自分は存在しなかったのでxorg.confを再生成し,元の場所においてあげる必要があった. rootユーザーのまま # Xorg -configure # mv -f /root/xorg.conf.new /etc/X11/xorg.conf と入力.一行目でxorg.conf.newというファイルを生成し,二行目でそれを名前をxorg.confに変更しながら元の場所へ戻す. 原因1のせいだった人はこれで直ると思う. 2への対処法 1で直らなかった人は2の可能性がある.CUIで編集ができるエディタ(自分はviを使用した)を起動し,gdm3というパッケージのcustom.confというファイルを編集する. # vi /etc/gdm3/custom.conf この中に, custom.conf #WaylandEnable=false というコメントアウトされた行がある.この先頭の#を外し,Waylandを使用しないようにする. 保存し終了したら, # sync # sync # reboot で同期,再起動を実行する. 自分はこれで直った! 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む