忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

前回記事
■ 参考 : 【crontab】を使ってジョブを自動化させたメモ




この後も度々crontabにお世話になっていた
そして、今日設定ファイルを修正しようとして間違ってcrontab -rを実行してしまった

rオプションはcrontabの設定ファイルをremoveするためのオプション(要するに初期化)

なんでeの隣のrにしたんだよ・・・
初期化という意味でiとかでいいやろ・・・

普通に殺意沸いたわ・・・実行してしまった自分に・・・ ガチ凹み




twitterで悲鳴をあげていたら、プロからgitで管理しろとありがたい助言を頂いた・・・

ただ、/var/spool/cron/crontab/ は管理者権限がないと見れないらしいので今回は使えない・・・

とりあえず.cshrcに
alias crontab 'crontab -i'
と追記しておいた

これでcrontab -rとしても「本気か?」って確認される
crontabからrオプションを駆逐するのは次回に持越し








PR
scpするときに転送先に、そのディレクトリがなかった
scpのオプションでなんとかできるのかな〜と思ったけど、sshでできるらしい
ssh hoge@hoge.ac.jp mkdir new_dir

アカウント名 hoge
ssh先 hoge.ac.jp
実行するコマンド mkdir new_dir






% su
rootに切り替える
ただし今いるディレクトリからは動かない

% su -
rootに切り替える
ただし今いる場所からルートのホームディレクトリに移動する

■ 参考 : su と su - の違い


違いは - の有無
-を付けるとrootの設定ファイルを読み込む
-をつけないと設定ファイルを読み込まないので、一般ユーザーの設定したPATHとかがそのまま引き継がれる








NISを使ってパスワードを共有している計算機を使う機会があった

hogeというユーザを追加する方法は
% su
% useradd -m -g users hoge
% passwd hoge

% cd /var/yp
% make
これでOK


ユーザが自分自身でNISで共有するパスワードを変更したいときは
%yppasswd

ユーザが自分自身でログインシェルを変更したいときは
%ypchsh










sshfsコマンドを使えばOK
Macへのインストールはportでできる
sshfs @2.10 (fuse)
SSH filesystem for FUSE
使い方はsshとほぼ同じだけど、事前にローカル(手元)でディレクトリを作っておいた方がいい
(Macでは作らなくてもいけたけど、Linuxだと事前に用意必須)
sshfs ユーザ名@ssh先のホスト名:マウントするディレクトリへのPATH ローカルでのマウント位置

例えば
mkdir foo
sshfs your_name@hoge.com:/somewhere foo
Macの場合、最初に警告が出て環境設定での許可が必要だった(スクショ撮り忘れた)




マウントを解除するときは
diskutil unmount foo
fusermountを使って
fusermount -u foo
でも解除できる
uオプションなしだと
fusermount: old style mounting not supported
というエラーができて、マウントを解除できなかった


それでも無理ならpsでPIDを調べてkillコマンドで終了させる






sshfsが今やろうとしてることの要件に叶うかは微妙かも?
ssh先のファイルの処理は全部手元でやるので、ファイルを全部scpしてきてるのと変わらなかった
毎回scpしなくても1度sshfsするだけでよくなるのが利点かも






(2019/07/26 追記)

sshfsで接続したときに、接続先のディレクトリをread-onlyで接続したいときは
sshfs your_name@hoge.com:/somewhere foo -o ro
みたいにオプションを付ければOK






(2020/03/02 追記)

接続を解除しようとしたら次のエラーが出た
fusermount: failed to unmount /home/hoge/data: Device or resource busy

接続を解除は
sudo umount -l data





(2020/04/06 追記)

エラーが出て勝手に接続が切れていた
cannot access 'hoge': Transport endpoint is not connected
一度
fusermount -u hoge
で接続を切ってから再接続するとエラーが消えた




(2020/04/06 追記)

sshfsでマウントが接続切れになったときに自動的に復旧するオプションを見つけた
sshfs your_name@hoge.com:/somewhere foo -o ro -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3


■ 参考 : SSHFS - auto reconnect

■ 参考 : サーバ起動時にマウント













■ 参考 : scpの使い方 -l オプション (帯域制限)

■ 参考 : rsync, wget, curl, scp に速度制限をかける方法まとめ

scp -l 8192 hoge.txt name@where:

単位は [Kbit/s]

メモ
2MB ~ 16000Kbit
1MB ~ 8000Kbit
500KB ~ 4000Kbit
100KB ~ 800Kbit










設定ファイルが読めない状況でファイル修正をしないといけなくて、やむを得ずviを使った
:qが終了なことは覚えてたけど(覚えてないと詰む)、今回は修正をしないといけなかった

修正はiで編集モード変更に切り替えて行うっぽい
モードを閲覧モードに帰るときはESC

:q セーブせずに終了
:q セーブせずに強制終了
:w セーブするが終了しない
:wq セーブして終了

検索や置き換えが簡単にできそう

今はずっとemacsを使ってるけど、正直emacsを使いこなしてるわけではないからviでもいいのかもしれん
最近はそんなにコードを書けていないから、もっと頑張らねば

■ 参考 : viエディタの使い方








めちゃくちゃ便利だわ、xargs




■ 参考 : xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個)

基本的には
コマンド1 | xargs コマンド2

パイプと似てる
パイプだと ls *.txt | wc とかみたいに左のコマンドの結果をより右に渡して実行される
xargsも同じような感じだけど、それにいろいろとオプションをつけてさらに高度なことができる



自分的に便利だと思ったのは

xargs -p : 実行するか毎回確認できる

xargs -P 2 : 同時にプロセスを複数走らせられる、この場合は2

xargs -d区切り文字 : デフォルトだとスペースになってる、これをアンダーバーとかにできる


ひとまずメモ









ただのメモ
echo "hogehoge" 1>&2





(2023/08/15 追記)

リダイレクトで使いたい時は、
echo "hogehoge" >> hoge.txt 1>&2
このブログで初めてcrontabのことを書く〜
crontabは定期的になんらかのコマンドを走らせるときに便利、ということは度々聞いてたけど
今回始めて使うことになってしまった・・・・

今までどうしてたかというと
sleep 3600; echo "hoge"
みたいな感じで手作業で待機させて走らせていた・・・
アナログ人間的発想って感じだ・・・ 別の言い方をすると発想がおじいちゃん






自分が走らせたかったのはただのシェルスクリプト
自分のシェルで動くことは確認済

crontabを走らせる設定は以下のコマンドで書く
crontab -e
EDITORという変数を設定していないと、viとかで編集することになるので設定しておく
setenv EDITOR "emacs -nw"
まずは動作テスト
次のようにcrontabe -eで設定する
* * * * * echo "hoge" > ~/hoge.txt
これで、1分ごとにhoge.txtが更新されるはず
ls -ltなどでhoge.txtの最終更新日が確認できる


現在の設定は
crontabe -l
で表示できる

左から
[分, 0~59] [時, 0~23] [日, 1~31] [月, 1~12] [曜日, 0~7, 0=7=日曜, またはsun~satでも指定できる] [コマンド]
に対応する

コメントアウトをしたかったら、#でそのジョブを止めれる


この次に、自分のシェルスクリプトを使って動作テストをする
が、うまく動いてくれない

何が原因で動いてくれないのかはエラー出力や標準出力がないからわかりにくい
そこで、
* * * * * echo “hoge" >>~/log1.txt 2>> ~/log2.txt
のようにして、標準出力と標準エラーをファイルに書き出す
これでエラーメッセージが読めるようになる


このあとでトラブったのがPATHやLD_LIBRARY_PATHなどの環境変数の設定
crontabを実行するときは、PATHなどがすべてリセットされてほとんど空の状態になる
シェルスクリプトを動かすのに必要なのはPATHやLD_LIBRARY_PATHくらいなのでそれをセットする
セットする方法は以下のページに何種類も提案されてる

■ 参考 : cronジョブを作るのにいつものやり方でいいんですか?

■ 参考 : cron実行時の環境変数を設定

■ 参考 : シェル上だと動くのに、CRONに登録したら動かない!!!なんでだぁー!!!を解決する為の記事です。


自分はcrontabにそのまま直書きする方法にした
50 10 * * * PATH=/usr/local/bin:/usr/bin:/bin:$HOME/bin:. LD_LIBRARY_PATH=/usr/local/lib/:$HOME/local/lib/ hoge.sh >>~/log1.txt 2>> ~/log2.txt
これで動いた





(2019/06/12 追記)
crontab -rを実行して設定ファイルの爆破に成功した方へ

■ 参考 : 【crontab】のrオプションを誤って実行してしまった人向け記事






毎時15分じゃなくて、本当に15分ごとに何かを実行したいときは
*/15 * * * * PATH=/usr/local/bin:/usr/bin:/bin:$HOME/bin:. LD_LIBRARY_PATH=/usr/local/lib/:$HOME/local/lib/ hoge.sh >>~/log1.txt 2>> ~/log2.txt

■ 参考 : 時間をずらしてcronを実行する

1-56/15とすれば毎時1分, 16分, 31分, ・・・とかもできるらしい







カレンダーを英語で表示するには、
% env LC_TIME=C cal

June 2018
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


今の言語環境とかを引き継いで起動する場合は
% cal

6月 2018
日 月 火 水 木 金 土
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30





■ calコマンドのオプション

cal -y
今年の1年分のカレンダーを表示する

cal -3
先月、今月、来月の3ヶ月分を表示する

cal 6 2019
2019年6月のカレンダーを表示

cal 29 6 2019
はダメだった








■ 過去記事 : 【多段ssh】するときに楽な方法を2つ紹介

まず、4年前の自分へ
「2つめは ~/.ssh/configを活用する方法
最後まで書ききる元気がなくなったので参考リンクだけ残しておきます」
と書いていますが、今はそれをガッツリ使っています
一歩ずつではあるが着実に成長してるでぇ〜





今回はパスワードなしでssh(scp)する方法についてメモしときます

■ 過去記事 : sshの設定(passwordなしでsshログイン(scp)する)

ここが一番分かりやすいです
% ssh-keygen -t rsa

鍵の保管場所を聞かれる
デフォルトは~/.ssh/id_rsaなのでそのままenterを押して許可

パスフレーズを要求されるが、今はこれをなしにしたいのでEnterを押す
再度確認されるのでEnter
鍵が~/.ssh以下にできる

このうち公開鍵(public key)をssh先も転送する
% ssh-copy-id -i ~/.ssh/id_rsa.pub yourname@hoge.co.jp:

ログイン先にログインして、 ~/.ssh/authorized_keys というファイルがあればOK
実際に
ssh -Y yourname@hoge.co.jp
でログインできることも確認する


追加で他の人からファイルが見えないようにする設定がいるかと思ったけどいらなかった
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys




(2018/07/11 追記)

もし複数の秘密鍵を持っておきたい場合は
% ssh-keygen -t rsa -f ~/.ssh/id_rsa.hoge
のようにして出力ファイル名を指定できる

このとき、デフォルトでは~/.ssh/id_rsaの秘密鍵が読み込まれるようなので、秘密鍵を接続先に応じて使い分けたい場合は ~/.ssh/configに次のように秘密鍵の場所を指定しておくと良い
IdentityFile ~/.ssh/id_rsa.home







% [[ `echo 'AAAAAAA' | grep 'B'` ]] && echo "with B" || echo "without B"
without B
% [[ `echo 'AAAAAAAB' | grep 'B'` ]] && echo "with B" || echo "without B"
with B
■ 参考 : 文字列Aに文字列Bが含まれるか











ちょいちょい出力が違うけどメモ
sh-4.2$ ls -F fig | grep /
12113/
12114/
12115/
12116/
12118/
12134/
 

sh-4.2$ ls -l fig | grep ^d
drwxr-xr-x 2 usename hoge 4096 Jun 21 05:23 12113
drwxr-xr-x 2 usename hoge 131072 Jun 21 09:05 12114
drwxr-xr-x 2 usename hoge 4096 Jun 21 08:01 12115
drwxr-xr-x 2 usename hoge 131072 Jun 21 05:54 12116
drwxr-xr-x 2 usename hoge 131072 Jun 21 13:15 12118
drwxr-xr-x 2 usename hoge 4096 Jun 21 13:24 12134

sh-4.2$ ls -l fig | grep ^d | awk '{print $9}'
12113
12114
12115
12116
12118
12134

sh-4.2$ find fig -maxdepth 1 -type d
fig
fig/12114
fig/12118
fig/12134
fig/12116
fig/12113
fig/12115
ディレクトリじゃなくてファイルが知りたいときは
find fig -maxdepth 2 -type f






■ 指定した深さのディレクトリorファイルのみを一覧する

-depthというオプションもあったので、それでいけるかと思ったけどダメ
しょうがないのでmindepthとmaxdepthの合わせ技で・・・・・
find fig -maxdepth 2 -mindepth 1 -type d | sort -r

find fig -maxdepth 2 -mindepth 1 -type f | sort -r









実行ファイルが foo/hoge.txt というファイルを読み込んで解析をするとする
このとき、実行ファイルにfoo/hoge.txtと直書きして実行するとファイルが見つからないとエラーが出る

おそらくcondorが実行されるときに、実行ファイルを別の場所にそのままコピーして実行するので
カレントディレクトリで実行されるわけではないからこういうエラーが起こってる
じゃあ、foo/hoge.txt も一緒にコピーしてもらえばいいのではと思って少し調べた



以下のページに説明があった
■ 参考 : 2.5 Submitting a Job3
transfer_input_files = foo/hoge.txt

これでfoo/hoge.txtも転送されて解析されるかと思ったけど、ダメ


あとはサブミットファイルの中で
Initialdir = [今のでぃれくとり]

のようにもしてみたが、同じだった

結局、foo/hoge.txt を絶対PATHで書くことで解決した








quick lookで見れなくてイラッとした

まずはechoで本当に思ってるファイルがリストされてるのか確認
そのあと、mv で実際にリネームすればOK
#!/bin/sh
for i in `find . -name "*dat"`
do
mv $i ${i%.dat}.txt
#echo $i
done










以前書いた記事のおさらい+まとめみたいな感じ

■ 参考 : 【シェルスクリプト】2の累乗をfor文で回す

■ 参考 : 【シェルスクリプト】exprを使わずにより早いfor文を書く







$(())という書き方は実はもっと色々とできるっぽい
↓の記事に詳しくまとめられている

■ 参考 : bashで四則演算( -×÷)や割り算のあまり(剰余)を求めるような簡単な計算をする

・四則演算
・余りを求める $(( 5 % 3 )) とか(今回はこれが使いたかった)
・累乗を求める
・偶奇の判定、$(( なんか & 1 ))で返り値が1なら奇数、0なら偶数


ただし、$(())の最大のデメリットは整数しか扱えないこと

小数を使いたい場合はbcコマンドを使う
またはawkとかでもOKか

■ 参考 : 【シェルスクリプト】bcコマンド








まず終了ステータスについて

■ 参考 : exitコマンド(シェルを終了する)

シェルスクリプトの最後に
exit [n]
と書いた場合はnが終了コード
nを書かない場合は最後に実行したコマンドの終了コードを引き継いで正常終了する
nに数字以外を書くとエラー終了

nは0から255の数字を入れる
1のみエラー終了、それ以外は正常終了






■ 参考 : 終了ステータスを設定
終了ステータスは $? というシェル変数に代入されているので、その値を見て処理を分岐させればOK


ただし、そんな処理分岐をしなくても
command1が成功したら、command2を実行するという風に処理を進めたい場合は次のように書けばOK
command1 && command2 && command3


コマンドが失敗した場合のみ進めるというのもあるが、こっちは使いみちがあんまりわからん
代替手段をcommand2とcommand3に書いておくのかな?
command1 || command2 || command3


rm -f の終了ステータスは常に0になる
他のユーザのファイルを削除しようとした場合は1になる
とりあえずrm -f の終了ステータスは信用しないようにする







話は変わって、シェルスクリプトのset -eについて

■ 参考 : シェルスクリプトを書くときはset -euしておく

この記事ではset -euと書いてあるけど、自分が使いたいのはひとまず set -e
これはシェルスクリプトの中で、正常終了しないコマンドがあった場合はそこでシェルスクリプトの処理が止まる

set -uは未定義の変数を使おうとしたときに打ち止めしてくれるオプション
ある処理がうまくいってなくて、その結果未定義な変数があるときにちゃんと処理を止めてくれるという優れもの


ある処理1からある処理2まではset -eのオプションの機能を止めたい場合は
set +e
# ここからset -eを止めてる
#
#
#
set -e
# ここからset -eが機能してる
#
みたいにset +eを使えばOK












条件分にコロンを使う
while :
do
# なんかする
done

条件分にtrueを使う
while true
do
# なんかする
done








最近何かのことを調べていて以下のブログにたどり着いた
色々とページを見てたら、目からウロコが落ちた
■ 参考 : 最近覚えたシェルスクリプトの小ネタ


「testコマンドを使うとフォークしてしまって大量に叩くとパフォーマンス悪い」らしい
つまり、if [ ]; thenのこと

その代用に挙げられていたのが
[[ "$a" = "hoge" ]] && echo "hoge" || echo "fuga"

これを使って・・・・

ファイルがあるかどうかで分岐
[[ -f $file ]] && echo "file aru" || echo "file nai"
ディレクトリがあるかどうかで分岐
[[ -d $dir ]] && echo "dir aru" || echo "dir nai"
[[ ]]と中身は絶対に半角スペースを開けないとエラーになるので注意

判定を反転させたいときは ! を -dとか-fの前につければいい

あと&&とか||の後の処理を複数行に分けて書きたいときは{ } でくくればOK







(2019/06/21 追記)

ファイルの存在を確認するときにワイルドカードを使いたい
そういうときはlsのエラー結果を使えばいい
ls /hoge/*.txt >/dev/null 2>&1
if [ $? -ne 0 ]; then
# 存在しない場合
else
# 存在する場合
fi

■ 参考 : ファイルの存在確認でワイルドカードを使う









新しい計算機にログインして、ふいにcontrol+Dを押してしまいログアウトしてしまった・・・
.cshrcをまだ用意していないのが原因だった

.cshrcに
set ignoreeof
と書いておけばOK

というか書いてある.cshrcをscpしていなかったからこうなっただけだった
何も知らずに偉い人の.cshrcを一部コピペしたりして使ってたけど、やはり先人は偉大だった


bashの場合は
IGNOREEOF=100
とかでcontrol+Dを100回まで無視するとか設定するらしい





わかりやすくcontrol+Dについてまとめられているページ↓

■ 参考 : Ctrl-D の話










自分のログインパスワードを変更する時にchpasswdと打って、sudo権限いるやんけ〜〜〜
とか言ってたアフォおる?(私だ)



passwd は自分のアカウントのパスワードを変更するときに使う
chpasswd は管理者が一括で複数のユーザーのパスワードを変更するときに使うコマンド(つまりsudo権限は必要)

■ 参考 : 【 passwd 】 ユーザーのパスワードを変更する

■ 参考 : Linuxで一括でユーザーのパスワード設定を行う方法








chsh -s /bin/tcsh



新しいMacを手に入れました
ログインシェルがbashになってることに気づかず、あれ?あれ?と右往左往して原因に気づきました

terminalの環境設定からたぶん変えられるけど、chshってコマンドじゃなかった?
と思って使ってみたら、viの知識必須だったみたいで心が折れました・・・

ググったらchsh -s 〜〜〜でいけると知ったのでメモメモ






(2018/02/15 追記)
場合によってはsudoいるかも
その後再起動する
sudo chsh -s /bin/tcsh









昨年の作業ディレクトリを整理しててちょっと困った・・・
ls -lで見ると年が表示されないので2016年のディレクトリなのか2017年のディレクトリなのか判別できない
調べてみると
ls --full-time
でいけるっぽい
一時的に
alias ll 'ls --full-time'
としてaliasに登録しておいて作業・・・

他にもlsは色んな時刻の表示形式に対応している

■ 外部リンク : ls -l コマンドで年を表示したり、ファイルの日付の表示形式を変えるには。











■ 参考 : 統計屋のためのAWK入門

ここの「AWKでなんか色々統計処理をやってみた」というsectionにワンライナーでコマンドがまとめられてる

以前から使ってる別のワンライナーコマンドをまとめたページも貼ろうと思ったけど、
記事が別の場所に移動して怪しかったのでやめた

分散と標準偏差が便利
ダブルコーテーションじゃなくてバッククオートじゃないといけなかった
# 平均
awk '{sum+=$1}END{print sum/NR}' hoge.txt

# 分散
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print s/(NR-1)}' hoge.txt

# 標準偏差
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print sqrt(s/(NR-1))}' hoge.txt

あとで気づいたけど、これ"あんちべ"さんだ・・・






別の記事に艦これの加賀さんが出て来ていたのでメモメモ

■ 面白い記事 : 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる





(2017/09/04 追記)

# シャッフルを用いた重複なしランダムサンプリング
awk 'BEGIN{srand()} {line[NR] = $0} END{for(;i<100000;i++){r=1+int(rand()*NR);s=1+int(rand()*NR);tmp=line[r];line[r]=line[s];line[s]=tmp};for(t in line)print line[t]}' hoge.txt | awk "NR <= 100"

これで100000回並べ替えを行って、そこから先頭の100個のデータを抽出できる
元のソースコードは上記と同じリンク

srandは現在の時刻から初期シードを生成して、乱数生成を行うので
1秒以内に同じコードを実行するとまったく同じ結果になってしまう

この処理を何度も行うときはsleep 2とかを間に挟んだ方が良い







プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]