runonce.sh 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/bin/bash
  2. if [[ $# -eq 0 ]]; then
  3. echo "Schedules a command to be run after the next reboot."
  4. echo "Usage: $(basename $0) <command>"
  5. echo " $(basename $0) -p <path> <command>"
  6. echo " $(basename $0) -r <command>"
  7. else
  8. REMOVE=0
  9. COMMAND=${!#}
  10. SCRIPTPATH=$PATH
  11. while getopts ":r:p:" optionName; do
  12. case "$optionName" in
  13. r) REMOVE=1; COMMAND=$OPTARG;;
  14. p) SCRIPTPATH=$OPTARG;;
  15. esac
  16. done
  17. SCRIPT="${HOME}/.$(basename $0)_$(echo $COMMAND | sed 's/[^a-zA-Z0-9_]/_/g')"
  18. if [[ ! -f $SCRIPT ]]; then
  19. echo "PATH=$SCRIPTPATH" >> $SCRIPT
  20. echo "cd $(pwd)" >> $SCRIPT
  21. echo "logger -t $(basename $0) -p local3.info \"COMMAND=$COMMAND ; USER=\$(whoami) ($(logname)) ; PWD=$(pwd) ; PATH=\$PATH\"" >> $SCRIPT
  22. echo "$COMMAND | logger -t $(basename $0) -p local3.info" >> $SCRIPT
  23. echo "$0 -r \"$(echo $COMMAND | sed 's/\"/\\\"/g')\"" >> $SCRIPT
  24. chmod +x $SCRIPT
  25. fi
  26. CRONTAB="${HOME}/.$(basename $0)_temp_crontab_$RANDOM"
  27. ENTRY="@reboot $SCRIPT"
  28. 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
  29. if [[ $REMOVE -eq 0 ]]; then
  30. echo "$ENTRY" >> $CRONTAB
  31. fi
  32. crontab $CRONTAB
  33. rm $CRONTAB
  34. if [[ $REMOVE -ne 0 ]]; then
  35. rm $SCRIPT
  36. fi
  37. fi