Dennis Williamson의 답변에 대한 노력에 진심으로 감사드립니다 . 그러나 우아하고 간단하기 때문에이 질문에 대한 답변으로 받아들이고 싶었습니다.
- 결국 설정하는 데 너무 많은 단계가 필요하다고 느꼈습니다.
- 루트 액세스가 필요합니다.
그의 솔루션은 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, 작업 디렉토리, 사용자)을 복제합니다.
- 기본적으로 다음 부팅 순서가 끝날 때까지 "지금 바로"실행되는 명령 실행을 기본적으로 연기하도록 설계되었습니다.