Solusi 1:
Buat @reboot
entri di crontab Anda untuk menjalankan skrip bernama /usr/local/bin/runonce
.
Buat struktur direktori bernama /etc/local/runonce.d/ran
menggunakan mkdir -p
.
Buat skrip /usr/local/bin/runonce
sebagai berikut:
#!/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
Sekarang tempatkan skrip apa pun yang ingin Anda jalankan pada reboot berikutnya (sekali saja) di direktori /etc/local/runonce.d
dan chown
dan chmod +x
itu dengan tepat. Setelah dijalankan, Anda akan menemukannya dipindahkan ke ran
subdirektori dan tanggal dan waktu ditambahkan ke namanya. Juga akan ada entri di syslog
Anda .
Solusi 2:
Saya sangat menghargai upaya yang dilakukan untuk jawaban Dennis Williamson. Saya ingin menerimanya sebagai jawaban atas pertanyaan ini, karena elegan dan sederhana, namun:
- Akhirnya saya merasa perlu terlalu banyak langkah untuk penyiapan.
- Ini membutuhkan akses root.
Saya pikir solusinya akan bagus sebagai fitur out-of-the-box dari distribusi Linux.
Karena itu, saya menulis skrip saya sendiri untuk mencapai hal yang kurang lebih sama dengan solusi Dennis. Itu tidak memerlukan langkah penyiapan tambahan dan tidak memerlukan akses 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
Simpan skrip ini (mis.:runonce
), chmod +x
, dan jalankan:
$ runonce foo
$ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)"
Jika terjadi kesalahan ketik, Anda dapat menghapus perintah dari antrean runonce dengan flag -r:
$ runonce fop
$ runonce -r fop
$ runonce foo
Menggunakan sudo berfungsi seperti yang Anda harapkan. Berguna untuk memulai server sekali saja setelah reboot berikutnya.
[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"
Beberapa catatan:
- Skrip ini mereplikasi lingkungan (PATH, direktori kerja, pengguna) tempat skrip dipanggil.
- Ini pada dasarnya dirancang untuk menunda eksekusi perintah karena akan dieksekusi "di sini, sekarang" hingga setelah urutan booting berikutnya.
Solusi 3:
Buat mis. /root/runonce.sh
:
#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local
Tambahkan ke /etc/rc.local
:
/root/runonce.sh
Solusi 4:
Saya menggunakan chkconfig
agar sistem saya secara otomatis menjalankan skrip sekali setelah boot dan tidak pernah lagi. Jika sistem Anda menggunakan ckconfig (Fedora, RedHat, CentOs, dll) ini akan berhasil.
Pertama skrip:
#!/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
- Beri nama skrip
run-once
- Tempatkan skrip di
/etc/init.d/
- Aktifkan skrip
chkconfig run-once on
- mulai ulang
Saat sistem mem-boot skrip Anda akan berjalan sekali dan tidak pernah lagi.
Artinya, tidak pernah lagi kecuali Anda menginginkannya. Anda selalu dapat mengaktifkan kembali skrip dengan chkconfig run-once on
perintah.
Saya suka solusi ini karena menempatkan satu dan hanya satu file pada sistem dan karena perintah run-once dapat dikeluarkan kembali jika diperlukan.
Solusi 5:
Siapkan skrip di /etc/rc5.d dengan S99 dan hapus sendiri setelah dijalankan.