Chr*_*ker 27 linux scheduled-task
我想安排一个命令在 Linux 机器上重新启动后运行。我知道如何执行此操作,以便在每次重新启动后使用@rebootcrontab 条目始终运行该命令,但是我只希望该命令运行一次。运行后,应将其从要运行的命令队列中删除。我本质上是在 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
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的、可编写脚本的方法来做到这一点?
Den*_*son 38
@reboot在您的 crontab 中创建一个条目以运行名为/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
Run Code Online (Sandbox Code Playgroud)
现在将您想在下次重新启动时运行的任何脚本(仅一次)放入目录中/etc/local/runonce.d,chown并chmod +x适当地放置它。运行后,您会发现它已移至ran子目录,并在其名称后附加了日期和时间。您的syslog.
Chr*_*ker 22
我非常感谢丹尼斯威廉姆森的回答所付出的努力。我想接受它作为这个问题的答案,因为它优雅而简单,但是:
我认为他的解决方案作为 Linux 发行版的开箱即用功能会很棒。
话虽如此,我编写了自己的脚本来完成与丹尼斯的解决方案或多或少相同的事情。它不需要任何额外的设置步骤,也不需要 root 访问权限。
#!/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
Run Code Online (Sandbox Code Playgroud)
保存此脚本(如:runonce)chmod +x,并运行:
$ runonce foo
$ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)"
Run Code Online (Sandbox Code Playgroud)
如果出现拼写错误,您可以使用 -r 标志从 runonce 队列中删除命令:
$ runonce fop
$ runonce -r fop
$ runonce foo
Run Code Online (Sandbox Code Playgroud)
使用 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"
Run Code Online (Sandbox Code Playgroud)
一些注意事项:
小智 6
创建例如/root/runonce.sh:
#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local
Run Code Online (Sandbox Code Playgroud)
添加到/etc/rc.local:
/root/runonce.sh
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36681 次 |
| 最近记录: |