GNU/Linux >> Linux の 問題 >  >> Linux

Linux:再起動後にコマンドを 1 回実行するようにスケジュールする (RunOnce と同等)

解決策 1:

@reboot を作成します /usr/local/bin/runonce というスクリプトを実行するための crontab のエントリ .

/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 にもエントリがあります .

解決策 2:

Dennis Williamson の回答に注がれた努力に本当に感謝しています。しかし、それはエレガントでシンプルなので、この質問に対する答えとして受け入れたいと思いました:

  • 最終的には、セットアップに必要な手順が多すぎると感じました。
  • root アクセスが必要です。

彼のソリューションは、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 を使用すると、期待どおりに動作します。次回の再起動後に一度だけサーバーを起動する場合に便利です。

[email protected]:/home/myuser$ sudo runonce foo
[email protected]:/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
[email protected]:/home/myuser$ sudo cat /root/.runonce_foo
PATH=/usr/sbin:/bin:/usr/bin:/sbin
cd /home/myuser
foo
/home/myuser/bin/runonce -r "foo"

いくつかのメモ:

  • このスクリプトは、それが呼び出された環境 (PATH、作業ディレクトリ、ユーザー) を複製します。
  • 「今ここで」実行されるコマンドの実行を、次の起動シーケンスの後まで延期するように基本的に設計されています。

解決策 3:

例を作成します。 /root/runonce.sh :

#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local

/etc/rc.local に追加 :

/root/runonce.sh

解決策 4:

chkconfig を使用しました システムが起動後に一度だけスクリプトを自動的に実行し、二度と実行しないようにします。システムが ckconfig (Fedora、RedHat、CentOs など) を使用している場合、これは機能します。

まずスクリプト:

#!/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 つのファイルしか置かず、必要に応じて 1 回限りのコマンドを再発行できるため、このソリューションが気に入っています。

    解決策 5:

    S99 を使用して /etc/rc5.d にスクリプトをセットアップし、実行後にスクリプト自体を削除します。


    Linux
    1. Linuxの再起動コマンド

    2. Linuxエコーコマンド

    3. Linux での echo コマンドの例

    1. Linux:特定のディレクトリでコマンドを実行する方法

    2. Linux でスーパーユーザーとして cd コマンドを実行する

    3. Linux で再起動をスケジュールするにはどうすればよいですか?

    1. Linuxでのエコーコマンド(例付き)

    2. Linuxでの16のエコーコマンドの例

    3. コマンドラインを使用してLinuxを再起動する方法