20210913のLinuxに関する記事は8件です。

aptでTomcat をインストール

update sudo apt update Tomcatのインストール sudo apt install tomcat9 tomcat9-admin Tomcatを自動起動するように設定。 sudo systemctl enable tomcat9 ファイアウォールポートを開く sudo ufw allow from any to any port 8080 proto tcp Tomcat起動確認 ブラウザで下記アクセス 自身のipアドレス:8080 tomcat「tomcat-users.xml」を開く sudo vi /etc/tomcat9/tomcat-users.xml 「tomcat-users.xml」に追加記述 <role rolename="admin-gui" /> <role rolename="manager-gui" /> <user username="tomcat" password="pass" roles="admin-gui,manager-gui" /> 元ネタブログの記述が「<role username=・・・」となっているが、正しくは「<user username=・・・」。記述を間違うとログインできない。 https://postgresweb.com/ubuntu-20-04-install-tomcat Tomcat再起動 sudo systemctl restart tomcat9 Tomcat Webアプリケーションマネージャを開く 自身のipアドレス:8080/manager/html webapp場所 /var/lib/Tomcat8/webapps 参考 https://postgresweb.com/ubuntu-20-04-install-tomcat
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】ログのアーカイブ設定

ログのアーカイブ logディレクトリに「yyyymmdd.log」というログが吐かれているとして、 シェル実行のタイミングで前月のログが存在するかどうか判定し、存在する場合は月ごとにアーカイブせぇ!! な時のメモ。 ##ログアーカイブ処理 THIS_MONTH=`date +'%Y%m01'` TARGET_MONTH=`date -d "${THIS_MONTH} 1 month ago" +'%Y%m'` cd /work/log/ ls |grep "${TARGET_MONTH}" |grep log >/dev/null 2>&1 if [ $? = 0 ]; then ls |grep "${TARGET_MONTH}" |grep ".log" |tar -cvz -T - --null -f ${TARGET_MONTH}.tar.gz --remove-files echo "Create_Archive_Log : ${TARGET_MONTH}.tar.gz" else echo "NO_Archive_Log" fi ・TARGET_MONTH変数にはスクリプトを実行した時点からみて前月のyyyymmが入ります。 ・lsはファイルがあると0、ないと1を返すのでそれで判定。grep2つでyyyymmかつ、.logで当てはまるファイルを検索検索ぅ!※ここはfindとかでもOK ・0を返した場合は同じようにlsして出てきたファイルをまとめてtar.gzにした後、削除する といった感じです。 以上お。 参考↓
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

新しいLinuxの教科書アウトプット第1章、第2章

Linuxメリット 1.オープンソースで誰でも利用できる 2.品質の高い多くのソフトウェアが使える 3.世界中でサーバ用途として広く利用されているから信頼性が高い 4.操作を自動化するための仕組みが用意されており、サーバ運用しやすい Linuxデメリット 1.商用アプリケーションが少なく、office系が動作しないのが最もデメリット 2.日本語対応がされていない GUIとCLIの違い GUIはマウスやタッチパッドなどを使用して操作する方法 CLIはキーボードからコマンドを入力し、操作する方法 CLIが推奨されている (理由) (1)作業効率が良くなる (2)GUIの操作を覚えていてもあまり意味がない (3)プログラムの連携がしやすい (4)処理の自動化がしやすい linuxカーネルとは CPUやメモリなどのハードウェアを管理するとともに、コマンド実行を処理するプロセス管理を行うもの シェルとは 人間が直接操作できないlinuxカーネルを操作するための、カーネルにユーザーインターフェイスとなっているソフトウェア ユーザーからのコマンドを解釈し、linuxカーネルに処理の依頼をして、処理結果を受け取り、結果をユーザーに表示する役割 カーネルとシェルが分かれていることによる利点 linuxカーネルに手を入れずにシェルだけを自分好みに変更できる linux以外のosを使う場合もシェルが移植されていれば同じ操作を行うことができる シェルに問題が起きた場合linuxカーネルへの影響を最小限にできる プロンプトとは ユーザー名@ホスト名~ $ 上記のような状態でシェルがコマンドの入力待ちをしている状態 対話型操作とシェルスクリプト 対話型操作はユーザーがキーボードからコマンドを入力し、シェルを直接操作する方法 シェルスクリプトは実行したいコマンド群をあらかじめファイルに記述しておき、そのファイルをシェルに指定して実行する方法 シェルの種類 sh, csh, bash, tcsh, zsh シェルの切り替え シェルの名前を入力するだけ、ただし切り替わっているのではなくシェルを重ねているので元のシェルに戻るにはシェルの数だけ抜け出すコマンドを打つ必要がある。 抜け出すにはexit ターミナルとは ユーザがコンピュータへの入出力する際に使用する専用のハードウェア ターミナルとシェルの違い ターミナルエミュレータは入出力を提供するだけのソフトウェア、windowsマシンや、mac上で動いている シェルはターミナルというウィンドウの中で、動いており、linuxマシン上で動いている
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gtk3アプリのTreeViewの表示の簡略化 Part3

Gtk3 TreeViewの表示の簡略化 Part3 gtk-Sharpチュートリアルに書かれているサンプルを簡略化します 前回からの改良点 TreeView上のCell内で値を編集できるようにした using System; using System.Collections.Generic; using Gtk; using UI = Gtk.Builder.ObjectAttribute; namespace treeView3GtkApplication { class MainWindow : Window { [UI] private TreeView _treeView1 = null; List<Song> songs; public MainWindow() : this(new Builder("MainWindow.glade")) { } private MainWindow(Builder builder) : base(builder.GetRawOwnedObject("MainWindow")) { builder.Autoconnect(this); _mkTreeView(); } void _mkTreeView() { songs = new List<Song>(); songs.Add (new Song ("Dancing DJs vs. Roxette", "Fading Like a Flower")); songs.Add (new Song ("Xaiver", "Give me the night")); songs.Add (new Song ("Daft Punk", "Technologic")); Gtk.TreeViewColumnEx artistColumn = new Gtk.TreeViewColumnEx (); artistColumn.Title = "Artist"; //CellRenderの生成 artistColumn._mkCellRendererText(_treeView1 , "",100); //モデルのプロパティを指定する artistColumn.bindingPropertyName = "Artist"; Gtk.TreeViewColumnEx songColumn = new Gtk.TreeViewColumnEx (); songColumn.Title = "Song Title"; songColumn._mkCellRendererText(_treeView1 , "",100); songColumn.bindingPropertyName = "Title"; Gtk.ListStore musicListStore = new Gtk.ListStore (typeof (Song)); foreach (Song song in songs) { musicListStore.AppendValues (song); } _treeView1.Model = musicListStore; _treeView1._mkBinding(); } } public class Song { public Song (string artist, string title) { this.Artist = artist; this.Title = title; } //リフレクションを有効にするためgetとsetを書く public string Artist { get; set; } public string Title { get; set; } } } TreeView拡張クラス namespace Gtk { static class GtkExtensions { public static void _mkBinding(this TreeView treeView) { foreach (TreeViewColumnEx column in treeView.Columns) { if (!(column is TreeViewColumnEx)) { return; } TreeViewColumnEx columnt1 = (column as TreeViewColumnEx); columnt1._mkBinding(); } } } } TreeViewColumnEx 派生クラス using System; using System.Reflection; using Gtk; using Gdk; public static class objectExtensions { public static object _performSelector_Property(this object obj, string propertyName) { try { Type magicType = obj.GetType(); PropertyInfo pi = magicType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); MethodInfo getMethod = pi.GetGetMethod(); object result = getMethod.Invoke(obj, null); return result; } catch (Exception e) { Console.WriteLine(e.Message); } } public static void _setSelector_Property(this object obj, string propertyName ,dynamic value) { try { Type t = obj.GetType(); PropertyInfo pi = t.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); MethodInfo setMethod = pi.GetSetMethod(); setMethod.Invoke(obj, new Object[1] { value }); }catch (Exception e) { Console.WriteLine(e.Message); } } } namespace Gtk { public class TreeViewColumnEx : TreeViewColumn { public String bindingPropertyName = ""; private Gtk.ListStore listStore1 = null; public CellRendererText _mkCellRendererText(TreeView treeView , string title = "" , int width = 0 , bool isEditable = true, bool isExpand = false, bool isPackStart = true) { if (title != "") { this.Title = title; } Gtk.CellRendererTextEx CellRendererText1 = new Gtk.CellRendererTextEx(); if (width != 0) { this.MinWidth = width; } this.Expand = isExpand; this.Sizing = TreeViewColumnSizing.Autosize; this.PackStart(CellRendererText1, isPackStart); listStore1 = (ListStore)treeView.Model; if (isEditable) { CellRendererText1.Editable = true; CellRendererText1.Edited += delegate(object o, EditedArgs args) { Gtk.CellRendererTextEx o1 = (Gtk.CellRendererTextEx)o; TreePath treePath1 = new TreePath (args.Path); TreeIter iter; if (listStore1 != null) { listStore1.GetIter (out iter, treePath1); object testModel1 = (object)listStore1.GetValue(iter, 0); _setModelData(testModel1, bindingPropertyName, args.NewText); } }; } treeView.AppendColumn(this); return CellRendererText1; } public CellRendererPixbuf _mkCellRendererPixbuf(TreeView treeView , string title = "" ,int width = 0 , bool isExpand = false ,bool isPackStart = true) { if (title != "") { this.Title = title; } Gtk.CellRendererPixbuf CellRendererPixbuf1 = new Gtk.CellRendererPixbuf(); if (width != 0) { this.MinWidth = width; } this.Expand = isExpand; this.Sizing = TreeViewColumnSizing.Autosize; listStore1 = (ListStore)treeView.Model; this.PackStart(CellRendererPixbuf1, isPackStart); //this.AddAttribute (CellRendererPixbuf1, "pixbuf", 0); treeView.AppendColumn(this); return CellRendererPixbuf1; } public CellRendererToggle _mkCellRendererToggle(TreeView treeView , string title = "",int width = 0 , bool isToggled = false ,bool isExpand = false ,bool isPackStart = true) { if (title != "") { this.Title = title; } Gtk.CellRendererToggle CellRendererToggle1 = new Gtk.CellRendererToggle(); if (width != 0) { this.MinWidth = width; } this.Expand = isExpand; this.Sizing = TreeViewColumnSizing.Autosize; listStore1 = (ListStore)treeView.Model; if (isToggled) { CellRendererToggle1.Toggled += delegate(object o, ToggledArgs args) { TreeIter iter; if (listStore1.GetIterFromString(out iter, args.Path)) { object object1 = (object)listStore1.GetValue(iter, 0); object value = object1._performSelector_Property(bindingPropertyName); String val = Convert.ToBoolean(value) == true ? "false" : "true"; _setModelData(object1, bindingPropertyName, val); } }; } this.PackStart(CellRendererToggle1, isPackStart); treeView.AppendColumn(this); return CellRendererToggle1; } public CellRendererProgress _mkCellRendererProgress(TreeView treeView , string title = "", int width = 0 , bool isExpand = false ,bool isPackStart = true) { if (title != "") { this.Title = title; } Gtk.CellRendererProgress CellRendererProgress1 = new Gtk.CellRendererProgress(); if (width != 0) { this.MinWidth = width; } this.Expand = isExpand; this.Sizing = TreeViewColumnSizing.Autosize; listStore1 = (ListStore)treeView.Model; this.PackStart(CellRendererProgress1, isPackStart); treeView.AppendColumn(this); return CellRendererProgress1; } public void _mkBinding() { if(this.Cells.Length > 0) { this.SetCellDataFunc(this.Cells[0], new Gtk.TreeCellDataFunc(_RenderCellDo)); } } private void _RenderCellDo(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.ITreeModel model, Gtk.TreeIter iter) { if(!(column is TreeViewColumnEx)) { return; } TreeViewColumnEx column1 = (column as TreeViewColumnEx); if(column1.bindingPropertyName == "" || column1.bindingPropertyName == null) { Console.WriteLine("PropertyNameがない"); return; } object modelData = (object)model.GetValue(iter, 0); object value = modelData._performSelector_Property(column1.bindingPropertyName); _setCellData(value, cell); } private void _setCellData(object value ,Gtk.CellRenderer cell) { if (value != null && cell is Gtk.CellRendererText && (value is String)) { (cell as Gtk.CellRendererText).Text = value as String; }else if (value != null && cell is Gtk.CellRendererText && (value is int)) { (cell as Gtk.CellRendererText).Text = ((int)value).ToString(); }else if (value != null && cell is Gtk.CellRendererText && (value is long)) { (cell as Gtk.CellRendererText).Text = ((long)value).ToString(); }else if(value != null && cell is Gtk.CellRendererText && (value is DateTime)) { (cell as Gtk.CellRendererText).Text = ((DateTime)value).ToString(); } else if(value != null && cell is Gtk.CellRendererPixbuf && (value is String)) { (cell as Gtk.CellRendererPixbuf).Pixbuf = new Pixbuf(null, (value as String)); } else if(value != null && cell is Gtk.CellRendererToggle && (value is String)) { (cell as Gtk.CellRendererToggle).Active = Convert.ToBoolean((value is String)); } else if(value != null && cell is Gtk.CellRendererProgress && (value is String)) { (cell as Gtk.CellRendererProgress).Value = Convert.ToInt32((value is String)); } else if(value != null && cell is Gtk.CellRendererPixbuf && (value is byte[])) { (cell as Gtk.CellRendererPixbuf).Pixbuf = new Pixbuf((byte[])value); } else if(value != null && cell is Gtk.CellRendererToggle && (value is Boolean)) { (cell as Gtk.CellRendererToggle).Active = (Boolean)value; } else if(value != null && cell is Gtk.CellRendererProgress && (value is int)) { (cell as Gtk.CellRendererProgress).Value = (int)value; } } private void _setModelData(object modelData1 , String bindingPropertyName1 , String value ) { Type t = modelData1._getKata(bindingPropertyName1); if (value != null && t.Equals(typeof(String))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToString(value)); }else if (value != null && t.Equals(typeof(int))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToInt32(value)); }else if (value != null && t.Equals( typeof(double))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToDouble(value)); }else if (value != null && t.Equals(typeof(long))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToInt64(value)); }else if (value != null && t.Equals( typeof(Boolean))) { modelData1._setSelector_Property(bindingPropertyName1,Convert.ToBoolean(value)); }else if (value != null && t.Equals( typeof(bool))) { modelData1._setSelector_Property(bindingPropertyName1,Convert.ToBoolean(value)); }else if (value != null && t.Equals( typeof(DateTime))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToDateTime(value)); }else if (value != null && t.Equals( typeof(decimal))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToDecimal(value)); }else if (value != null && t.Equals( typeof(char))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToChar(value)); }else if (value != null && t.Equals( typeof(byte))) { modelData1._setSelector_Property(bindingPropertyName1, Convert.ToByte(value)); } } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SRv6 End.DT4を試してみた

Linuxで SRv6 End.DT4 functionがサポートされたが情報があまり公開されていないため、 利用方法をまとめてみました。 構成例 SRv6 End.DT4とは SRv6ルーターのエンドポイントノードが SRヘッダーを外して、そのルーターの指定された VRF RIBをルックアップして送信する Endpointファンクションである。 End.DX4の場合、コネクテッドな IPv4 Next-hopしか送信できないため、(ルーティングテーブルを参照しない)より柔軟な構成が可能である。 Build Linux kernel & iproute2 Ubuntu20.04 Linux kernel ビルド Linuxの End.DT4は vrf strict modeの有効化が必要なため、CONFIG_NET_VRFが有効化されたカーネルが必要がある。 Ubuntu20.04の genericカーネルでは有効化されていないため、ビルドし直す必要がある。 以下のページのカーネルビルド方法を参考に、カーネルのビルド設定ファイル .config の CONFIG_NET_VRFを有効に変更してビルドする。 (CONFIG_NET_VRF=y) # vi .config CONFIG_NET_VRF=y iproute2最新版インストール iproute2 を最新版をインストールする。 設定 細かい基礎設定は省きます。 Router A ip route add default encap seg6 mode encap segs fd01:b::1 dev ens192 ip -6 route add fd01:a::1 encap seg6local action End.DX4 nh4 192.168.0.2 dev ens224 Router B vrf strict modeを有効にする。 # sysctl -wq net.vrf.strict_mode=1 End.DT4は vrftableしか lookupできないので、vrfを作成する。 ip link add vrf100 type vrf table 100 ip link set vrf100 up ip link set dev ens224 master vrf100 ip route add default via 192.168.1.1 table 100 ip route list vrf vrf100 ip route add 192.168.0.2 encap seg6 mode encap segs fd01:a::1 dev ens192 table 100 ip -6 route add fd01:b::1 encap seg6local action End.DT4 vrftable 100 dev ens192
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxのサーバからAzure FilesをSMBマウントする方法

概要 LinuxサーバからAzure上のストレージアカウントに作成したAzure Filesに SMBマウントする方法です。 意外と簡単にできたんですが、マウントするサーバにAzure CLIをインストールする必要があり、諸事情で実作業では使えなかったので備忘録。。。 関連ページはこちら↓ SMB Azure ファイル共有を Linux でマウントする Linux に Azure CLI をインストールする ※今回はAzure上のRHEL8.1のサーバで検証しました。 手順 ①Azure Filesの作成 Azure Portalからストレージアカウント上にAzure Filesを作成します。 Azure Portalにログインして、ストレージアカウントの画面を開く 「ファイル共有」をクリックして、Azure Filesを作成する ②Azure CLIのインストール Azure FilesをマウントするサーバにAzure CLIをインストールします。 ※LinuxサーバからのマウントはAzure CLIのインストールが必須です。 対象サーバにログインする Microsoft リポジトリ キーをインポートする sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc azure-cli リポジトリ情報を作成する echo -e "[azure-cli] name=Azure CLI baseurl=https://packages.microsoft.com/yumrepos/azure-cli enabled=1 gpgcheck=1 gpgkey=https://packages.microsoft.com/keys/microsoft.asc" | sudo tee /etc/yum.repos.d/azure-cli.repo Azure CLIのインストールを実行する sudo dnf install azure-cli ①のAzure Filesが存在しているサブスクリプションにログインする az login # 認証画面が開かれるため、必要な情報を入力して対象のサブスクリプションにログインしてください。 対象のサブスクリプションが表示されることを確認 az account list # 異なるサブスクリプションが表示されている場合は、以下のコマンドでサブスクリプションを変更してください。 az account set --subscription <"対象のサブスクリプションID"> ③Azure Filesのマウント ①で作成したAzure Filesに②のサーバからマウントします。 対象のストレージアカウントへ接続確認(エラーが出力されないことを確認します) resourceGroupName="<接続するAzure Files(ストレージアカウント)が存在するリソースグループ名>" storageAccountName="<接続するAzure Filesが存在するストレージアカウント名>" fileShareName="<接続するAzure Files名>" httpEndpoint=$(az storage account show --resource-group $resourceGroupName --name $storageAccountName --query "primaryEndpoints.file" | tr -d '"') smbPath=$(echo $httpEndpoint | cut -c7-$(expr length $httpEndpoint)) fileHost=$(echo $smbPath | tr -d "/") nc -zvw3 $fileHost 445 サーバ上にマウントポイントを作成する mntRoot="<Azure Filesをマウントするフォルダ>" mntPath="$mntRoot/$storageAccountName/$fileShareName" sudo mkdir -p $mntPath # mntpathで指定されているパスにフォルダが作成されていることを確認する 接続先のストレージアカウント情報を指定する httpEndpoint=$(az storage account show --resource-group $resourceGroupName --name $storageAccountName --query "primaryEndpoints.file" | tr -d '"') smbPath=$(echo $httpEndpoint | cut -c7-$(expr length $httpEndpoint))$fileShareName storageAccountKey=$(az storage account keys list --resource-group $resourceGroupName --account-name $storageAccountName --query "[0].value" | tr -d '"') マウント実行 sudo mount -t cifs $smbPath $mntPath -o username=$storageAccountName,password=$storageAccountKey,serverino マウントされていることを確認する df -Th [root@XXXXXXXX ~] # df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs tmpfs 3.9G 8.7M 3.9G 1% /run tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/mapper/rootvg-rootlv xfs 2.0G 329M 1.7G 17% / /dev/mapper/rootvg-usrlv xfs 10G 2.2G 7.9G 22% /usr /dev/mapper/rootvg-varlv xfs 8.0G 704M 7.4G 9% /var /dev/mapper/rootvg-homelv xfs 1014M 40M 975M 4% /home /dev/sda1 xfs 496M 144M 352M 30% /boot /dev/mapper/rootvg-tmplv xfs 2.0G 47M 2.0G 3% /tmp /dev/sda15 vfat 495M 6.9M 488M 2% /boot/efi /dev/sdb1 ext4 16G 45M 15G 1% /mnt tmpfs tmpfs 782M 0 782M 0% /run/user/1001 ★//XXXXXXX.file.core.windows.net/testmedia cifs 10G 0 10G 0% /mount/XXXXX/testmedia # ↑ 2.で作成したマウントポイントにAzure Filesがマウントされていることを確認する これでAzure Filesにマウントされました。 このあとは、通常の共有ファイルと同様、ストレージアカウント上からもサーバ上からも操作可能です。 試してはないですが、サーバの/etc/fstabに必要な情報を記載しておけば、サーバ起動時の自動マウントも可能みたいです。 以上です。 Linuxの操作嫌い&Azureのコマンド操作はPowerShallしか基本使わないので、CLIよく分からない状態でやってみましたが、 それでも簡単にできたので、機会があれば使ってみようと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

systemctlでエラーになったときの詳細確認方法

systemctlで以下のようなエラーがでることがある。例はsidkiq。 Job for sidekiq.service failed because the control process exited with error code. See "systemctl status sidekiq.service" and "journalctl -xe" for details. でも statusを見てもjournalctlをしてもさっぱり原因がわからない.. そんなときは以下の流れで詳細が確認できる。 "systemctl cat サービス名" コマンドを実行してUnitファイルを見る。 [Service]以下の「WorkingDirectory」と「ExecStart」を取得。 WorkingDirectoryに移動してExecStartの中身を実行。ここで実行時のエラー内容が直接確認できる!! [参考] https://kazuminkun.hatenablog.com/entry/2016/08/30/234458
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Web技術 リンク集

https://kitsune.blog/ より Webシステム Webシステムやインフラ Webサーバ APサーバ DBサーバ Webシステムの仕組み Web通信の仕組み Linux Linuxの基礎 Linuxのディレクトリ構成 Linuxのパーミッション Linux環境の構築 Linuxコマンド Vim yum Linuxのショートカット MySQL データベースの構造や仕組み MySQLのインストール MySQLのログインや設定ファイル MySQLの基本操作コマンド Webサーバ Nginx NginxとRails NginxでSSL設定
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む