なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

cronでありがちな罠

cronでありがちな罠

仕事や趣味でcronを使ったときにありがちな罠をまとめてみた

cronの設定方法がよくわからん

  • 一般ユーザーでcronを設定するときはcrontab -eすればいいeはeditのe
  • 有名な罠だがcrontab -rすると設定済みのcronが消えるのでやらないこと

cronの書き方がぱっとわからない

  • /etc/crontabを見るとサンプルがあるので見るとわかりやすい。crontab上で環境変数を設定できる。
    • SHELL:cronが実行されるときに読まれるシェルを指定できる、まあbashから変えることないけど
    • PATH:cronが実行されるときに設定されるPATHが指定できる、PATHだけ設定したいならばPATH=$PATH:/opt/your/desired/pathとか設定すればいいのでは
    • MAILTO:cronが実行されたときに結果が通知されるメールアドレスを指定できる、Linux上のユーザー名を指定できるしpostfixなどが動いていれば外部のメールアドレスなども指定できる。ちなみにカンマ区切りで複数指定できる。
    • 肝心の時刻設定はcrontab.guruなどでcronの記法を試せるサイトがあるので、実際に適当に書いてみて試せばわかりやすい

Crontab.guru - The cron schedule expression editor

$ sudo cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

xenv系(pyenv, rbenv)のパスが通ってないのでcronが実行できない

  • cronの実行時にsource ~/.bashrcしてやればとりあえず動く

cronの結果ログが見れない

  • 例えばcrontabの設定でMAILTOに何も設定していない場合「新しいメールが /var/spool/mail/{ユーザー名} にあります」とかメールが来る
  • そいつをmail -f /var/spool/mail/{ユーザー名}して読めば、中に標準出力が出ており確認できる

mailコマンドの使い方はググってください

cron上で%を文字列に使うとエラーで落ちる

リンク先の解説が詳しいが、「%」は「\%」にしてエスケープしないと動かない
tech.mktime.com

Debian10でVirtualBoxが動かないのでvirt-managerを使い始めた

Debian10でVirtualBoxが動かないのでvirt-managerを使い始めた。

wiki.debian.org

DebianWikiページによると

Packages for VirtualBox are not available in Debian 10 and won't be in buster-backports either. A recommended alternative is Virtual Machine Manager (buster/virt-manager). See also this link that explains some useful basics for qemu

あれ?Debian10ではVirtualBox使えない(かメンテされてない)みたい。道理で起動しないわけだ。代替としてvirt-managerがあるらしい。

packages.debian.org

インストールは

$ sudo apt-get install virt-manager

するだけ

試しにUbuntu20をインストールしてみたらうまく動いている。Qemuベースなのかな?

f:id:panzer-jagdironscrap1:20210305233336p:plain

HDDからディスク容量の小さいSSDに移行した

メインPCのCPUをRyzen 5 3600に移行した話の続き
nantonaku-shiawase.hatenablog.com

  • SSD 660p Series SSDPEKNW512G8XT」とかいう超速いSSDを入手したが、元のHDDのブートディスクが2TBデータを持っているのに対してSSDは512GBしかない
  • どうやってデータ移行して起動できるようにするかという話

gpartedでefi用の領域を用意する

以降、SSDのデバイス名を「/dev/nvme0n1」として記載

  • GPTのエントリを書き込む
$ sudo gdisk /dev/nvme0n1
w

容量200MB程度
Partition Name:『ESP』
基本パーティション
ラベル:『ESP』
ファイルシステム:『FAT32

applyしたあと、作られた領域を右クリックして、『フラグを編集』をクリック。 

  • 『boot』
  • 『esp』

の二つにチェックマークを付る

上記で2つのパーティションができる。以降、efi用の領域を「/dev/nvme0n1p1」、データ用の領域を「/dev/nvme0n1p2」として手順を記載する。

rsyncでデータ用の領域を同期

// コピー先SSD
$ sudo mkdir /mnt/ssd
$ sudo mount /dev/nvme0n1p2 /mnt/ssd
// コピー元HDD
$ sudo mkdir /mnt/hdd
$ sudo mount /dev/sda1 /mnt/hdd

// rsyncドライラン
$ sudo rsync -avr --owner --group --dry-run /mnt/hdd /mnt/ssd

// rsync実行(全体の進捗を出す、圧縮させると重いので-zはつけない)
$ sudo rsync -ar --info=progress2 --owner --group /mnt/hdd/ /mnt/ssd/

grubのインストール

grubをインストールする

// grub2の準備
$ sudo apt-get install grub-efi-amd64-bin

// chrootする(rootで実行していく)
$ sudo su

// データ用の領域をマウントする
# mkdir /chroot
# mount /dev/nvme0n1p2 /chroot

// プログラム実行に必要なものをbind
# mount --bind /dev /chroot/dev
# mount --bind /dev/pts /chroot/dev/pts
# mount --bind /proc /chroot/proc
# mount --bind /sys /chroot/sys
# mount --bind /run /chroot/run
# chroot /chroot

chrootしたらefi用の領域をマウント

// 無ければ /boot/efi は作っておく
# mkdir -p /boot/efi
# mount /dev/nvme0n1p1 /boot/efi

空のEFI領域にブートプログラムであるところのgrubをインストール

# grub-install --target=x86_64-efi --efi-directory=/boot/efi --recheck
# ls -l /boot/efi/EFI/debian/
合計 5202
-rwxr-xr-x 1 root root     108  227 00:40 BOOTX64.CSV
-rwxr-xr-x 1 root root 1206824  227 00:40 fbx64.efi
-rwxr-xr-x 1 root root     117  227 00:40 grub.cfg
-rwxr-xr-x 1 root root 1533296  227 00:40 grubx64.efi
-rwxr-xr-x 1 root root 1261192  227 00:40 mmx64.efi
-rwxr-xr-x 1 root root 1322936  227 00:40 shimx64.efi

/etc/fstabの編集

  • /etc/fstabを以下のように編集し、再起動
  • 起動するディスクはefiをインストールしたやつにする
  • 事前にsudo blkid /dev/nvme0n1p1, sudo blkid /dev/nvme0n1p2 しておきPARTUUIDを記録しておく
$ sudo cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system>                               <mount point> <type> <options>         <dump> <pass>
PARTUUID=6e1ae4f9-bf29-4d76-a1b5-bfed57c80ee1 /boot/efi     vfat   errors=remount-ro 0      2
PARTUUID=ac09284a-8f98-46e0-a613-04f2b5621055 /             ext4   errors=remount-ro 0      1

くぅ~疲れましたw これにて完結です!