20210501のLinuxに関する記事は6件です。

crontabでうまく起動しなかった時の自分流対処方法

crontab スクリプトを定期的に起動するおなじみのcrontab。 ラズパイをメディアサーバーとして使ったり、VPSをソケット通信のサーバーにしたり、 ラズパイカメラで定時撮影したり。 そんな時にcrontabを使っています。 systemctlも定期で使えるのですが、書き方が複雑でとっつきにくく。。 無意識にcrontabを使っています。 crontabが起動しない コードは完成したのに、いざcrontabを書いてワクワクしながら待っていても プログラムが起動しないという虚しいことが多々あります。 ネット上の偉大な先輩たちは、「いや、だからログを残せよ!!」と言っていますが、 とりあえずこの方法でほぼできるので書いておきます。 sleepで時間解決 crontab内に、@ rebootで起動時にスクリプトを起動するようにしている場合、 システムの起動の準備ができていないのに、スクリプトを実行してしまい、 エラーになっている場合があります。 そこで、実行するのをシェルスクリプトで待ってあげます。 exe_script.sh #!/bin/sh #システムが準備ができるまで少し待つ。 sleep 10 #スクリプトの実行 /usr/bin/python3 /home/user/main_script.py これをcrontabで呼び出します。 screenで起動 「手動ではエラーなしで実行できるのに、crontabではできてない!」 という場合、screenコマンドを使うと解決しちゃうことがあります。 (エラーの原因はわからず終いですが...) exe_screen.sh #!/bin/sh #システムが準備ができるまで少し待つ。 sleep 10 #「server」というセッションでスクリプトを実行。 LD_LIBRARY_PATH=. screen -dmS server /bin/sh /home/user/exe_file.sh これをcrontabに書いておきます。 確認 そして、実行がどんな感じになっているか確認するときは、 shell screen -r server とすると、セッションに入ることができます。 終了する場合は 『Ctrl + a』の後に、『d』を押すと、終了せずに抜けることができます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 7のインストールの仕方(2021年4月現在)

「新しいLinuxの教科書」を読んでいて、本に従ってCentOS7のインストールを進めようと思いましたが、本に載っているURLの先にインストールすべきものが見当たらず、ググっても情報が出てこず、迷子になりました。 そのURLは下記です。 CentOS URL http://www.centos.org/ そこのどこかに、ミラーサイト一覧に行く道があり、「CentOS-7-x86_64-DVD-1503-01.iso」みたいな感じのファイル名の「DVD ISO」イメージなるものがあるそうなのですが。 これを開いてもこういうページになってしまい、ありませぬ...↓ で、彷徨っていたら、このページにたどり着きました。 DVDあった!ミラーサイト(mirrors)もあるぽい! https://wiki.centos.org/Download jpドメインサイトならどこでもOKと本に書いてある通り、jpドメインのリンクもある! 本書執筆時点ではCentOS-7-x86_64-DVD-1503-01.isoというファイル名となっていました。 それに似てるファイルある! これをダウンロードすると、その後無事に参考書に合流することができます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonのリアルタイム性能

pythonでsleep(遅延)したときに、実際にどれ位の時間スリープするかという話です。マイクロ秒単位のリアルタイム処理が可能みたいです。ここで「リアルタイム性」とは、狙った時刻に処理を行えるという性質です。OSに依存する話で、以下の話はラズパイ4B上のリアルタイムパッチが当てられたDebian 11 BullseyeのLinuxカーネルと普通のカーネル実験しました。x86_64でも同じことをやって傾向は同じでした。 更新: qemu内でも同じことを行って同じ傾向を得たので追記しました Linux上のプログラムの実行優先度の変更 nice ナイス値(-20 〜 +19)を変化させます。ナイス値が小さいほうが優先して実行されるます。最も優先して実行するには nice --20 やりたいこと のようにプログラムを起動します。 chrt ナイス値の調整よりもさらに優先度を上げたい場合や下げたい使います。割り込み処理も含めてあらゆる処理を押しのけて実行させたい場合 chrt --fifo 99 やりたいこと とし、他に何もやることが無い場合にだけ実行させたい場合 chrt --idle 0 やりたいこと とします。 実験 実験の下準備 apt-get install stress-ng linux-cpupower cpupower frequency-set -g performance でCPU動作周波数を最高値に固定します stress-ng --timeout 300 --parallel 0 --class pipe & でOSとすべてのCPUに負荷を掛けます。pipe を interrupt に変えるとよりキビシクなります。 実験結果 狙った遅延と平均の誤差をマイクロ秒単位で表示しています。RTと標準とQEMUはそれぞれLinuxのカーネルの種類を表します。QEMUはQEMU内のDebian 11標準amd64カーネルです。QEMUを動かしているときにホストOSはほぼアイドル状態でした。nice -19 および chrt --idle 0 で起動したら遅延の計測プログラムが終了しなかったので、結果を載せていません。 実行優先度・OS種別\狙った遅延 100 1000 10000 100000 1000000 10000000 普通に起動・標準 47403.7 1216.6 14996.0 164.6 1061.6 8126.5 普通に起動・RT 79.9 69.1 85.5 223.6 1082.1 10211.5 普通に起動・QEMU 15575.3 4335.5 134.1 9424.7 1068.2 9318.9 nice --20・標準 2404.2 85.8 32285.5 162.5 982.1 7887.1 nice --20・RT 132.0 89.1 120.8 174.0 3862.4 10071.6 nice --20・QEMU 3532.0 1384.8 5940.3 174.6 911.7 7940.7 chrt --fifo 99・標準 30.6 38.5 64.3 61.8 69.7 63.1 chrt --fifo 99・RT 31.6 21.0 44.6 56.1 64.7 66.4 chrt --fifo 99・QEMU 166.9 58.4 58.4 69.4 78.3 73.7 リアルタイム性が必要な場合は chrt --fifo 99 で起動するのがよいです。リアルタイムパッチを当てなくても chrt --fifo 99 でかなりのリアルタイム応答性が実現できるようです。 上記のQEMU内での実験時には、ホストLinuxの負荷はほぼゼロでしたが、ホストLinuxの負荷が高い場合にはQEMUの実行が優先されるようにchrt --fifoでQEMUが実行されるようにしないとQEMU内でのリアルタイム性能は保証されないはずです。libvirt や virt-manager から起動するQEMUの実行優先度の設定はvcpusched, iothreadsched ならびに emulatorsched で行うことができます。 実験用プロググラム 以下のプログラムを用いて狙った遅延と実際の遅延の差(誤差)をマイクロ秒単位で測っています。time_ns() がPython 3.7で導入されたため、Python 3.7かそれ以降ではないと動作しません。使用したPythonバージョンはDebian 11標準の3.9です。 import time for 狙った遅延 in (0.0001, 0.001, 0.01, 0.1, 1.0, 10.0): print('狙った遅延=' + str(狙った遅延)) 誤差の合計 = 0 for i in range(3): 前の時刻 = time.time_ns() time.sleep(狙った遅延) 後の時刻 = time.time_ns() 誤差 = (後の時刻 - 前の時刻) / 1000000000 - 狙った遅延 print('誤差={:.1f}マイクロ秒'.format(誤差*1000000)) 誤差の合計 += 誤差 print('平均の誤差={:.1f}マイクロ秒'.format(1000000 * 誤差の合計 / 3)) 上記のpythonプログラムを以下のシェルスクリプトで起動しました #!/bin/sh export LANG=C.UTF-8 exec </dev/null >>log.txt 2>&1 set -ex date uname -a cpupower frequency-set -g performance # 次の行で pipe を interrupt に変えるとよりキビシクなります stress-ng --timeout 300 --parallel 0 --class pipe & python3 sleep-test.py nice --20 python3 sleep-test.py chrt --fifo 99 nice --20 python3 sleep-test.py nice -19 python3 sleep-test.py #chrt --idle 0 nice -19 python3 sleep-test.py kill -TERM $! sleep 3 chrt --fifo 99 pkill stress cpupower frequency-set -g schedutil
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10のHyper-Vで仮想マシンを作る

プロローグ Windowsの仮想環境といえばHyper-Vです。 同じようなものにOracleのVirtualBOXやVMware Playerなどがありますが、Hyper-VはWindowsOSに標準搭載されているのでお手軽に利用でき、採用する環境がWindowsならば相性の点からも都合がよいです。 ガッツリ利用する場合はサーバ環境が多いでしょうが、Hyper-VはWindows10でも利用できますので、個人の検証などに利用するのも良いでしょう。 ここでは、Hyper-vの導入と仮想マシンを作成する直前までやっていきます。 想定時間は約10分です。 前提条件 ・OS:Windows10 Pro ※homeではHyper-vは利用できません ・スペック:Linux1台分のHDD、メモリ、cpu 流れ Hyper-vの機能をWindows10に導入します 仮想ハードディスクを作成します 仮想マシンを作成します ISOをマウントしてLinuxのインストールできる状態にします 手順 とりあえずProであることを確認しておきます プログラムと機能よりHyper-vを有効にします 管理ツールに導入されたHyper-Vマネージャを起動します 起動したHyper-vマネージャより、「新規 - ハードディスク」を実行します 「次へ」を押下します 「VHDX」を選択し、「次へ」を押下します 容量の状態を選択して「次へ」を押下します。 ここでは、固定を選択しました。 名前と場所を決めて「次へ」を押下します 仮想ハードディスクのサイズを決めて「次へ」を押下します 内容に問題なければ「完了」を押下します ハードディスクはHyper-Vとは独立しているので、画面からは確認できませんので、直接エクスプローラより仮想ハードディスクが作成されたことを確認します Hyper-Vマネージャより、「新規 - 仮想マシン」を実行します 「次へ」を押下します 仮想マシンの名前と格納先を選択して、「次へ」を押下します 世代を選択します ちなみにこのあと起動しようとしているcentos8.2は2世代ではそのままでは起動できないので、1世代を選択します メモリサイズを決めて「次へ」を押下します。 ちなみにメモリは後から変更できるので、ここでは適当でよいです ネットワークを設定します。 これも後から設定できるので、適当でよいです 先ほど作成した仮想ハードディスクを選択して、「次へ」を押下します ちなみに、わかりやすいように事前に仮想ハードディスクを作成しておきましたが、ここでも仮想ハードディスクを作成できます。 内容に問題なければ「完了」を押下します 仮想マシンが作成されました。 LinuxのISOをマウントするので、右クリックより設定を開きます。 左ペインの「IDE1コントローラー1」の「DVDドライブ」を選択して、右ペインで「イメージファイル」にISOファイルを選択して「OK」を押下します。 メインメニューより仮想マシンを起動します 仮想マシンをダブルクリックして仮想マシンを開き、Linuxのインストールが開始されていることを確認します エピローグ Hyper-Vを導入して仮想マシンが作成できました 一番時間がかかるところは仮想ハードディスクを作成するところで、サイズが大きければなかなか時間がかかりますが、数十ギガサイズならば、トータル10分程度で完了できたのではないでしょうか。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Yoctoを試す(その1:はじめに)

Yoctoを用いてRaspberryPi用Linuxを作成 3年以上前に一度だけトライしBuild自身はできたが、うまく動作できずでほっておいた。久しぶりにやる気がでたのでリトライした結果、動作したのでここに記録する。その2の予定はあるが、その次もあるか現段階では不明。 開発環境とターゲット PC CPU: Core i5-4460 3.2GHz RAM: 16GB OS: Lubuntu 18.04.3 LTS Buildに相当な時間がかかるので、高スペックがベター。 RaspberryPi Raspberry Pi 1 Model B+ 大昔に買ったもの。 準備 ここでは、本家ページの古い(?)情報をもとに、必要なパッケージをインストールした。最新状況はこちらから確認すべきであろう。 ~/proj/yocto$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping libsdl1.2-dev xterm Build前の環境設定 検索すると非常に多くの情報が見つかるが、ここでは同じターゲット(Raspberry Pi 1 Model B+)のこの記事をベースに進める。 Pokyや必要なレイヤなどをGet ~/proj/yocto$ git clone http://git.yoctoproject.org/git/poky ~/proj/yocto$ git clone http://git.yoctoproject.org/git/meta-raspberrypi ~/proj/yocto$ git clone git://git.openembedded.org/meta-openembedded PATH追加 Bitbake実行のため、PATHに追加を行う。 ~/proj/yocto$ PATH=~/proj/yocto/poky/bitbake/bin:$PATH 実行前の環境設定 ~/proj/yocto$ source poky/oe-init-build-env build 「build」は好きな名前でよい。これを実行すると、「build」ディレクトリに移動し、次のメッセージが表示される。 You had no conf/local.conf file. This configuration file has therefore been created for you with some default values. You may wish to edit it to, for example, select a different MACHINE (target hardware). See conf/local.conf for more information as common configuration options are commented. You had no conf/bblayers.conf file. This configuration file has therefore been created for you with some default values. To add additional metadata layers into your configuration please add entries to conf/bblayers.conf. The Yocto Project has extensive documentation about OE including a reference manual which can be found at: http://yoctoproject.org/documentation For more information about OpenEmbedded see their website: http://www.openembedded.org/ ### Shell environment set up for builds. ### You can now run 'bitbake <target>' Common targets are: core-image-minimal core-image-full-cmdline core-image-sato core-image-weston meta-toolchain meta-ide-support You can also run generated qemu images with a command like 'runqemu qemux86' Other commonly useful commands are: - 'devtool' and 'recipetool' handle common recipe tasks - 'bitbake-layers' handles common layer tasks - 'oe-pkgdata-util' handles common target package tasks 最初はエラーかと思ったが、要するに、「conf/local.conf」と「conf/bblayers.conf」とがない(正確に言うとConfigurationされていない)ので編集、、、と「bitbake 」でBuild、、ということ。 conf/local.conf 修正部分のみ記載。所持するモデル「Raspberry Pi 1 Model B+」には、次の設定がベターらしい。 MACHINE ?= "raspberrypi" conf/bblayers.conf(1回目) 関連部分のみ記載。まずは、「meta-openembedded」を除いてBuildする。 BBLAYERS ?= " \ /home/undeux3/proj/yocto/poky/meta \ /home/undeux3/proj/yocto/poky/meta-poky \ /home/undeux3/proj/yocto/poky/meta-yocto-bsp \ /home/undeux3/proj/yocto/meta-raspberrypi \ " Build bitbake 「bitbake」でBuildを実施する。 ~/proj/yocto/build$ bitbake core-image-base 「core-image-base」は作成するイメージのターゲットのひとつ。他には、上述した「oe-init-build-env」実行時に表示されるものや、本家サイトのここにターゲットが見つかる。この違いについては、理解できれば、別途調べることとする。 つまづき(Fetch Error) Fetch Errorが発生。例えば、次のようなもの。 ERROR: eudev-3.2.10-r0 do_fetch: Fetcher failure ERROR: qemu-native-5.2.0-r0 do_fetch: Fetcher failure 単にうまくDownloadできないだけらしい。解決方法を探すと、これやこれを参考に、downloadsディレクトリに直接パッケージをDownloadすることがベターと判断。 ~/proj/yocto/build/downloads$ https://dev.gentoo.org/~blueness/eudev/eudev-3.2.10.tar.gz ~/proj/yocto/build/downloads$ touch eudev-3.2.10.tar.gz.done ~/proj/yocto/build/downloads$ https://download.qemu.org/qemu-5.2.0.tar.xz ~/proj/yocto/build/downloads$ touch qemu-5.2.0.tar.xz.done 結果 Build時間は上記エラー対応も含めて4時間くらい、50GBもの容量を要した。 マイクロSDカードへの書き込み 「build/tmp/deploy/images/raspberrypi」にイメージが作成される。bmaptoolを使って書き込む。 ~/proj/yocto/build$ sudo apt install bmap-tools ~/proj/yocto/build/tmp/deploy/images/raspberrypi$ sudo bmaptool copy --bmap core-image-base-raspberrypi.wic.bmap core-image-base-raspberrypi.wic.bz2 /dev/sdd 「/dev/sdd」は環境により異なる。 ログイン Raspbianなどとは異なり、パスワードなしの「root」でログインできる。 次に 上記設定における「core-image-base」にsshが入っていなかったので、種々トライ。 conf/bblayers.conf(2回目) 「meta-openembedded」も一部加えてみた。 BBLAYERS ?= " \ /home/undeux3/proj/yocto/poky/meta \ /home/undeux3/proj/yocto/poky/meta-poky \ /home/undeux3/proj/yocto/poky/meta-yocto-bsp \ /home/undeux3/proj/yocto/meta-raspberrypi \ /home/undeux3/proj/yocto/meta-openembedded/meta-oe \ /home/undeux3/proj/yocto/meta-openembedded/meta-networking \ /home/undeux3/proj/yocto/meta-openembedded/meta-python \ " これで、「bitbake core-image-base」の結果として作成されるイメージにも、sshは含まれておらず。その時は詳細を調べる気がなかったので、別のターゲット(イメージ)を対象とした。 ~/proj/yocto/build$ bitbake core-image-sato これには、sshが含まれていた。 上記2回目のBuild(core-image-sato)はそれほど時間かからず ~/proj/yocto/build/tmp このディレクトリ配下にダウンロード済のパッケージや「core-image-base」用にBuildした結果が残されており、10−30分(記憶は定かでない)でBuildが完了したような気がする。 その後、sshについて調べる conf/local.confへ設定追加でOK 「IMAGE_FEATURES_append」や「IMAGE_INSTALL_append」に適切な追加を行うと、オプションで様々パッケージが追加できることが判明。本家サイトにも情報があるが、たとえば、この記事に「conf/local.conf」の設定例がわかりやすく記載されている。 IMAGE_FEATURES_append = " ssh-server-openssh" IMAGE_INSTALL_append = " openssh openssh-sftp-server" ダブルクオーテーション(”)の次の空白は大事らしい。上記を「conf/local.conf」に記載後、 ~/proj/yocto/build$ bitbake core-image-base で作成されたイメージに、sshが含まれていた。 「IMAGE_FEATURES_append」や「IMAGE_INSTALL_append」で検索すると、追加できるパッケージについて、有益な情報が見つかるようだ。 調査する中で有益と感じた情報 Yoctoとは この説明がナイスだった。 レシピ一覧を確認するコマンド ~/proj/yocto/build$ bitbake-layers show-recipes bitbakeで指定可能なターゲット(イメージ) ここに情報あり。 おわりに その2に続く(続きたい)。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

10進数の桁数確認プログラム

unsigned long型で10^20までの桁数を確認するプログラムです。 素数判定プログラムで巨大数を扱ったときに0を数えるのがめんどくさいので作りました。 最速の素数判定プログラム C# Java C++ 実用性重視でリファクタリング無しの駄作です。 WhatDecimal.c /* ============================================================================ Name : WhatDecimal.c Author : mio Version : 1.0 Copyright : mio Description : Hello World in C, Ansi-style ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define UNSIGNEDLONG_MAX 10000000000000000000 //18,446,744,073,709,551,615 int main() { while (1) { unsigned long input; unsigned long data; int cnt; scanf("%lu", &input); printf("data=%lu\n", input); for (cnt = 0, data = input; data > 0; data /= 10) cnt++; cnt--; printf("cnt zero=%d\n", cnt); printf("1"); int flag = 1; for(;cnt>0;cnt--) { switch (cnt) { case 4 + 3 * 0: printf("man\n"); cnt = 0; break; case 4 + 4 * 1: printf("oku\n"); cnt = 0; break; case 4 + 4 * 2: printf("tyo\n"); cnt = 0; break; case 4 + 4 * 3: printf("kei\n"); cnt = 0; break; case 3 + 4 * 4: printf("gai\n"); cnt = 0; break; case 3 + 4 * 5: printf("sen\n"); cnt = 0; break; default: printf("0"); break; } } } return 0; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む