GNU/Linux >> Belajar Linux >  >> Linux

Linux:Jadwalkan perintah untuk dijalankan sekali setelah reboot (setara dengan RunOnce)

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
  1. Beri nama skrip run-once
  2. Tempatkan skrip di /etc/init.d/
  3. Aktifkan skrip chkconfig run-once on
  4. 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.


Linux
  1. Perintah reboot Linux

  2. Perintah gema Linux

  3. Jalankan perintah cd sebagai superuser di Linux

  1. Cara Reboot Linux Menggunakan Command Line

  2. echo Contoh Perintah di Linux

  3. linux:cara menjalankan perintah di direktori tertentu

  1. Perintah Echo di Linux (Dengan Contoh)

  2. 16 Contoh Perintah Echo di Linux

  3. Bagaimana cara menjadwalkan reboot di Linux?