Запустить скрипт при следующей перезагрузке и удалить скрипт

Один из способов с rename:

rename -n 's/-//g;s/___(\w*)_(\w*)_(\w*)_/.IT.$2$3.$1./' *

В режиме -n ono это только печатает изменения, удаляет этот флаг для выполнения переименования. Первое выражение просто удаляет каждый дефис, второй сохраняет строки и заменяет часть подчеркивания.

Альтернативой является сохранение всего, что вам нужно в группах, таким образом вы также можете быстро изменить, например. дата:

rename -n 's/(\d*)-(\d*)-(\d*)___(\w*)_(\w*)_(\w*)_/$1$2$3.IT.$5$6.$4./' *

Пример выполнения

$ rename -n 's/-//g;s/___(\w*)_(\w*)_(\w*)_/.IT.$2$3.$1./' *
rename(2015-08-25___ANJ_BH_E_txt, 20150825.IT.BHE.ANJ.txt)
rename(2015-08-25___HSB_BH_Z_txt, 20150825.IT.BHZ.HSB.txt)
rename(2015-08-25___LSA_SP_E_txt, 20150825.IT.SPE.LSA.txt)
rename(2015-08-25___TEH_SP_N_txt, 20150825.IT.SPN.TEH.txt)
1
задан 21 February 2018 в 14:08

3 ответа

Вам нужно запустить crontab -e для пользователя, который запустит скрипт - sudo crontab -e для root или sudo -u user_name -e, для редактирования crontab для имени пользователя. Вставьте @reboot /path/to/file (NB! Не забывайте пустую новую строку). Сам сценарий должен выглядеть так:

#!/bin/bash
do_your_stuff
# remove from root specific crontab setting all the information about the script
sed -i '/@reboot \/path\/to\/file/d' /var/spool/cron/crontabs/root
# remove the script file itself
rm -- "$0"
# reboot the machine in 2 minutes
shutdown -r +2

Чтобы автоматизировать этот процесс, вы можете использовать Ansible. Вот пример простой пьесы, я запустил ее на своем локальном хосте:

---
- hosts: localhost
  tasks:
  - name: cron job
    cron:
      name: "a job for reboot"
      special_time: reboot
      job: "/path/to/file"

Во-первых, вам нужно запустить playbook, он обновляет задачи cron для root. После перезагрузки сценарий должен быть удален так же, как запись файла /var/spool/cron/crontabs/root с строкой root . Вы можете свободно изменять файл, чтобы полностью удалить crontab для root.

2
ответ дан 22 May 2018 в 12:59
  • 1
    Удаляет ли сам файл сценария какие-либо проблемы? И что произойдет, если запись cron останется, но файл там нет? – Tobias 21 February 2018 в 14:07
  • 2
    Я тестировал более простую версию скрипта, он отлично работает. Если вы используете /etc/crontab для автозапуска скрипта, вы должны добавить строку sed -i /@reboot/d /etc/crontab, чтобы удалить запись. Обновлен мой ответ. – M. Dm. 21 February 2018 в 14:17
  • 3
    Я хочу попробовать это, но просто чтобы убедиться, что правильно понял. Я добавляю @reboot / path / to / file к crontab, а строка sed в скрипте удаляет эту строку еще раз при запуске скрипта? – Tobias 21 February 2018 в 16:09
  • 4
    Я добавил @reboot / testscript (и поместил скрипт в / scriptcript) в / etc / crontab, но он, похоже, не запускается при перезагрузке. Если это должно работать с 16.04, что я могу делать неправильно? – Tobias 21 February 2018 в 16:51
  • 5
    Да, sed удаляет строку из файла crontab, прежде чем сообщать машине о перезагрузке. Является ли ваш скрипт исполняемым? – M. Dm. 21 February 2018 в 17:16

Вам нужно запустить crontab -e для пользователя, который запустит скрипт - sudo crontab -e для root или sudo -u user_name -e, для редактирования crontab для имени пользователя. Вставьте @reboot /path/to/file (NB! Не забывайте пустую новую строку). Сам сценарий должен выглядеть так:

#!/bin/bash do_your_stuff # remove from root specific crontab setting all the information about the script sed -i '/@reboot \/path\/to\/file/d' /var/spool/cron/crontabs/root # remove the script file itself rm -- "$0" # reboot the machine in 2 minutes shutdown -r +2

Чтобы автоматизировать этот процесс, вы можете использовать Ansible. Вот пример простой пьесы, я запустил ее на своем локальном хосте:

--- - hosts: localhost tasks: - name: cron job cron: name: "a job for reboot" special_time: reboot job: "/path/to/file"

Во-первых, вам нужно запустить playbook, он обновляет задачи cron для root. После перезагрузки сценарий должен быть удален так же, как запись файла /var/spool/cron/crontabs/root с строкой root . Вы можете свободно изменять файл, чтобы полностью удалить crontab для root.

2
ответ дан 17 July 2018 в 20:19

Вам нужно запустить crontab -e для пользователя, который запустит скрипт - sudo crontab -e для root или sudo -u user_name -e, для редактирования crontab для имени пользователя. Вставьте @reboot /path/to/file (NB! Не забывайте пустую новую строку). Сам сценарий должен выглядеть так:

#!/bin/bash do_your_stuff # remove from root specific crontab setting all the information about the script sed -i '/@reboot \/path\/to\/file/d' /var/spool/cron/crontabs/root # remove the script file itself rm -- "$0" # reboot the machine in 2 minutes shutdown -r +2

Чтобы автоматизировать этот процесс, вы можете использовать Ansible. Вот пример простой пьесы, я запустил ее на своем локальном хосте:

--- - hosts: localhost tasks: - name: cron job cron: name: "a job for reboot" special_time: reboot job: "/path/to/file"

Во-первых, вам нужно запустить playbook, он обновляет задачи cron для root. После перезагрузки сценарий должен быть удален так же, как запись файла /var/spool/cron/crontabs/root с строкой root . Вы можете свободно изменять файл, чтобы полностью удалить crontab для root.

2
ответ дан 23 July 2018 в 21:01

Другие вопросы по тегам:

Похожие вопросы: