Linuxボックスの再起動後に実行するコマンドをスケジュールしたいのですが。私はこれを行う方法を知っているので、コマンド 再起動するたびに一貫して実行されます と@reboot
crontabエントリですが、コマンドを1回だけ実行する必要があります。実行後、実行するコマンドのキューから削除する必要があります。私は本質的に、Windowsの世界で RunOnce に相当するLinuxを探しています。
重要な場合:
$ uname -a
Linux devbox 2.6.27.19-5-default #1 SMP 2009-02-28 04:40:21 +0100 x86_64 x86_64 x86_64 GNU/Linux
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ cat /etc/SuSE-release
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 0
これを行う簡単でスクリプト可能な方法はありますか?
デニス・ウィリアムソンの答え への努力に本当に感謝しています。エレガントでシンプルなので、この質問への回答としてそれを受け入れたかったのです。
彼のソリューションは、Linuxディストリビューションのすぐに使える機能として素晴らしいと思います。
そうは言っても、私は自分のスクリプトを書いて、デニスのソリューションとほぼ同じことを実現しました。追加のセットアップ手順やルートアクセスは必要ありません。
#!/bin/bash
if [[ $# -eq 0 ]]; then
echo "Schedules a command to be run after the next reboot."
echo "Usage: $(basename $0) <command>"
echo " $(basename $0) -p <path> <command>"
echo " $(basename $0) -r <command>"
else
REMOVE=0
COMMAND=${!#}
SCRIPTPATH=$PATH
while getopts ":r:p:" optionName; do
case "$optionName" in
r) REMOVE=1; COMMAND=$OPTARG;;
p) SCRIPTPATH=$OPTARG;;
esac
done
SCRIPT="${HOME}/.$(basename $0)_$(echo $COMMAND | sed 's/[^a-zA-Z0-9_]/_/g')"
if [[ ! -f $SCRIPT ]]; then
echo "PATH=$SCRIPTPATH" >> $SCRIPT
echo "cd $(pwd)" >> $SCRIPT
echo "logger -t $(basename $0) -p local3.info \"COMMAND=$COMMAND ; USER=\$(whoami) ($(logname)) ; PWD=$(pwd) ; PATH=\$PATH\"" >> $SCRIPT
echo "$COMMAND | logger -t $(basename $0) -p local3.info" >> $SCRIPT
echo "$0 -r \"$(echo $COMMAND | sed 's/\"/\\\"/g')\"" >> $SCRIPT
chmod +x $SCRIPT
fi
CRONTAB="${HOME}/.$(basename $0)_temp_crontab_$RANDOM"
ENTRY="@reboot $SCRIPT"
echo "$(crontab -l 2>/dev/null)" | grep -v "$ENTRY" | grep -v "^# DO NOT EDIT THIS FILE - edit the master and reinstall.$" | grep -v "^# ([^ ]* installed on [^)]*)$" | grep -v "^# (Cron version [^$]*\$[^$]*\$)$" > $CRONTAB
if [[ $REMOVE -eq 0 ]]; then
echo "$ENTRY" >> $CRONTAB
fi
crontab $CRONTAB
rm $CRONTAB
if [[ $REMOVE -ne 0 ]]; then
rm $SCRIPT
fi
fi
このスクリプトを保存(例:runonce
)、chmod +x
を実行します。
$ runonce foo
$ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)"
タイプミスが発生した場合は、-rフラグを使用してrunonceキューからコマンドを削除できます。
$ runonce fop
$ runonce -r fop
$ runonce foo
Sudoの使用は、期待どおりに機能します。次回の再起動後に一度だけサーバーを起動するのに役立ちます。
myuser@myhost:/home/myuser$ Sudo runonce foo
myuser@myhost:/home/myuser$ Sudo crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/root/.runonce_temp_crontab_10478 installed on Wed Jun 9 16:56:00 2010)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
@reboot /root/.runonce_foo
myuser@myhost:/home/myuser$ Sudo cat /root/.runonce_foo
PATH=/usr/sbin:/bin:/usr/bin:/sbin
cd /home/myuser
foo
/home/myuser/bin/runonce -r "foo"
いくつかのメモ:
Crontabに@reboot
エントリを作成して、/usr/local/bin/runonce
というスクリプトを実行します。
/etc/local/runonce.d/ran
を使用して、mkdir -p
というディレクトリ構造を作成します。
スクリプト/usr/local/bin/runonce
を次のように作成します。
#!/bin/sh
for file in /etc/local/runonce.d/*
do
if [ ! -f "$file" ]
then
continue
fi
"$file"
mv "$file" "/etc/local/runonce.d/ran/$file.$(date +%Y%m%dT%H%M%S)"
logger -t runonce -p local3.info "$file"
done
次に、次回の再起動時に(1回のみ)実行するスクリプトを/etc/local/runonce.d
およびchown
およびchmod +x
ディレクトリに適切に配置します。実行すると、ran
サブディレクトリに移動し、日付と時刻が名前に追加されます。 syslog
にもエントリがあります。
作成する/root/runonce.sh
:
#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local
追加 /etc/rc.local
:
/root/runonce.sh
/etc/rc5.dでS99を使用してスクリプトを設定し、実行後にスクリプトを削除します。
chkconfig
を使用して、システムが起動後に一度自動的にスクリプトを実行し、二度と実行しないようにしました。システムがckconfig(Fedora、RedHat、CentOなど)を使用している場合、これは機能します。
まずスクリプト:
#!/bin/bash
# chkconfig: 345 99 10
# description: This script is designed to run once and then never again.
#
##
# Beginning of your custom one-time commands
#
plymouth-set-default-theme charge -R
dracut -f
#
# End of your custom one-time commands
##
##
# This script will run once
# If you would like to run it again. run 'chkconfig run-once on' then reboot.
#
chkconfig run-once off
chkconfig --del run-once
run-once
という名前を付けます/etc/init.d/
に配置しますchkconfig run-once on
システムが起動すると、スクリプトは一度だけ実行され、二度と実行されません。
つまり、あなたが望んでいない限り、二度と二度とありません。 chkconfig run-once on
コマンドを使用して、いつでもスクリプトを再度有効にすることができます。
システムにファイルを1つだけ配置し、必要に応じてrun-onceコマンドを再発行できるため、このソリューションが気に入っています。
これはat
コマンドで実行できますが、(少なくともRHEL 5ではテストしましたが)at @reboot
またはat reboot
、ただしat now + 2 minutes
その後 shutdown -r now
。
この場合、システムの実行に2分以上かかることはありません。
「runonce」コマンドが標準キットであることを望みますが、0の設定が必要な場合に役立ちます。
私は この答え が最もエレガントだと思います:
スクリプトを/etc/init.d/script
に配置し、最後の行で自己削除します:rm $0
スクリプトが100%フェイルプルーフでない限り、致命的なエラーループを回避するために例外を処理するのがおそらく賢明です。