Edited at

Linux:シェルスクリプト: ファイル xxx が消えるまで待つ

More than 3 years have passed since last update.

もう出かける時間なのに、Firefox のダウンロードが終わらない。。。。

そんな場合のスクリプトです。


コマンドライン例。

:

: while_exist で「xxx.part」が消えるまで待って、それから warm_halt でシャットダウンします
:
$ while_exist xxx.part ; warm_halt
:
: 上のコマンドは返って来ません。このまま出かけましょう。
:

スクリプト。(パスの通っているディレクトリに置きます)


while_exsit.sh

#!/bin/bash

PATH=/usr/bin:/bin

file=${1:?"usage: $0 file [interval]"}
interval=${2:-60}

while [ -f "$file" ]
do
sleep $interval
done


(※2015/01/09 追記) このスクリプトを使わない代替方法があります。詳しくはコメント欄を参照ください。


warm_halt.sh

#!/bin/bash

PATH=/usr/bin:/bin:/sbin

#
# root 以外で実行する場合、
# `sudo sync` と `sudo shutdown` は NOPASSWD で実行できる必要があります
#
[ "$LOGNAME" = "root" ] && sudo="" || sudo=sudo

$sudo sync # 「sync は 2回」派、「sync は 4回」派の人は要調整
$sudo sync
$sudo sync
$sudo shutdown -h now


スクリプトの名前を変えたい場合は、シンボリックリンクを張るなどで対処してください。

以下は例です。

$ ln -s while_exist.sh while_exist   # 拡張子なしの名前でシンボリックリンクを張る

$ ln -s warm_halt.sh warm_halt # 〃


参考。sudo の NOPASSWD の設定。

visudo コマンドで sudo の設定ファイル(/etc/sudoers)を開いて編集します。

/etc/sudoers は root 権限が必要なので sudo をつけます。

$ sudo visudo


: or

$ sudo EDITOR=vim visudo # その場だけ vim を使って編集したい場合

例えば、lnznt アカウントに NOPASSWD で sudo を許可する場合、以下のような行を /etc/sudoers に追加して保存(エディタは終了)します。

lnznt       ALL=(ALL:ALL) NOPASSWD: ALL

上の書式の意味は以下ですので、セキュリティポリシなどに合わせて適宜変更してください。

  lnznt        ALL=(ALL:ALL)            NOPASSWD:     ALL

# アカウント名 ホスト=(ユーザ名:グループ名) NOPASSWD: コマンド名
# [誰が] [どこで] [誰になって] (パスワードなしで) [何を] する

# ※ホスト、ユーザ名、グループ名、コマンド名には ALL (全てを意味する) が指定可

もっと詳しいことは sudo(1)、sudoers(5) を参照してください。