Linux: 재부팅 후 한 번 실행되도록 명령 예약(RunOnce와 동일)

Linux: 재부팅 후 한 번 실행되도록 명령 예약(RunOnce와 동일)

Linux 상자에서 재부팅 후 실행할 명령을 예약하고 싶습니다. 나는 이것을 수행하는 방법을 알고 있으므로 명령재부팅할 때마다 일관되게 실행됩니다.crontab 항목을 사용하면 @reboot명령이 한 번만 실행되기를 원합니다. 실행된 후에는 실행할 명령 대기열에서 제거되어야 합니다. 나는 본질적으로 다음과 동등한 Linux를 찾고 있습니다.RunOnce윈도우 세계에서.

중요한 경우:

$ 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

이를 수행하는 쉽고 스크립트 가능한 방법이 있습니까?

답변1

@rebootcrontab에 항목을 생성하여 라는 스크립트를 실행합니다 /usr/local/bin/runonce.

/etc/local/runonce.d/ranusing 이라는 디렉터리 구조를 만듭니다 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

이제 다음 재부팅 시(한 번만) 실행하려는 스크립트를 디렉토리에 적절 하게 배치 /etc/local/runonce.d하십시오 . 일단 실행되면 하위 디렉터리로 이동되고 이름에 날짜와 시간이 추가되는 것을 볼 수 있습니다. 에도 항목이 있습니다 .chownchmod +xransyslog

답변2

쏟은 노력에 정말 감사드립니다.데니스 윌리엄슨의 답변. 그러나 나는 이 질문에 대한 답을 우아하고 단순하기 때문에 받아들이고 싶었습니다.

  • 궁극적으로 설정하는 데 너무 많은 단계가 필요하다고 느꼈습니다.
  • 루트 액세스가 필요합니다.

나는 그의 솔루션이 Linux 배포판의 기본 기능으로서 훌륭할 것이라고 생각합니다.

즉, 나는 Dennis의 솔루션과 거의 동일한 작업을 수행하기 위해 자체 스크립트를 작성했습니다. 추가 설정 단계가 필요하지 않으며 루트 액세스가 필요하지 않습니다.

#!/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"

몇 가지 참고사항:

  • 이 스크립트는 호출된 환경(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
  1. 스크립트 이름 지정run-once
  2. 스크립트를 다음 위치에 배치하세요./etc/init.d/
  3. 스크립트 활성화chkconfig run-once on
  4. 재부팅

시스템이 부팅되면 스크립트가 한 번만 실행되고 다시는 실행되지 않습니다.

즉, 당신이 원하지 않는 이상 다시는 하지 마십시오. 언제든지 명령을 사용하여 스크립트를 다시 활성화할 수 있습니다 chkconfig run-once on.

이 솔루션은 시스템에 단 하나의 파일만 저장하고 필요한 경우 한 번 실행 명령을 다시 실행할 수 있기 때문에 마음에 듭니다.

관련 정보