Как мне удалось понять из ОП:
my_script.py
, но вы не можете предсказать завершение или время выхода. my_script.py
выполняется и записывает в лог-файл (вызывайте его file.log
до тех пор, пока он не остановится. my_script.py
Это можно сделать разными способами. Один из них заключается в том, чтобы полагаться на inotify
из пакета inotify-tools
для мониторинга событий файловой системы по линии совершенно хороших ответов здесь и (, еще лучше)там .
В качестве альтернативы вышеизложенному можно вручную определить дату последней модификации файла журнала и проверить, продолжает ли отображаться pid вашего процесса. Поместите всю логику в короткий исполняемый bash-скрипт, например:
#!/bin/bash
/usr/bin/python my_script.py >> file.log & # launch process in background
my_proc_pid="$!" # save process pid for last executed command
prevtime=0 # initialize "previous modification time" variable
while : ; do
sleep 1 # check log file modification time every 1s
# modification time in milliseconds
if (( $(\find /path/to/file.log/ -name file.log -printf "%T") - prevtime > 30000)); then
#if (( "$(\ls -l --time-style=+%s /path/to/logfile/file.log | cut -d' ' -f6)" - prevtime > 30)); then
prevtime="$(\find /path/to/file.log/ -name file.log -printf \"%T\")"
#prevtime="$(\ls -l --time-style=+%s /path/to/logfile/file.log | cut -d' ' -f6)"
if (\ps | grep -v grep | grep "$my_proc_pid" &>/dev/null) ; then
# kill process in background, '&>' same as '>/dev/null 2>&1'
/usr/bin/kill -9 "$my_proc_pid" &>/dev/null
fi
# launch process and save its pid
/usr/bin/python my_script.py >> file.log &
my_proc_pid="$!"
fi
done
# use CTRL-C to stop loop execution and to exit script
Примечание:Я включил два способа поиска времени модификации вашего файла журнала. Тот, который не закомментирован, включает find
, который обрабатывает странные имена файлов (, например. с пробелами и т. д. )лучше, чем ls
, и не зависит ни от какой трубы. Однако в этом случае вы должны предоставить полный ПУТЬ к вашему файлу журнала(/path/to/logfile/
)в качестве первого аргумента cmd find
. В случае ls
вам необходимо указать тот же путь вместе с полным именем файла журнала, что и в:/path/to/logfile/file.log
Я частично проверил это на bash
v5.0.1. Сообщите о проблемах, если таковые имеются.ХТХ
Мне удалось решить проблему с помощью комментариев. Спасибо вам всем! Для полноты я быстро перечислю все шаги, которые я предпринял, чтобы исправить это :
.Quickfix -Если вам нужно быстро загрузиться без решения актуальной проблемы
Вставьте livestick с работающим загрузчиком (Я использовал Ubuntu 20.04 с GRUB)
После запуска GRUB из livestick прервите процесс загрузки, нажав c или esc .
Теперь определите загрузчик, который вы хотите использовать (для меня, это был загрузчик systemd, расположенный на моем жестком диске2, раздел 1)
chainloader (hd2,1)/efi/systemd/systemd-bootx64.efi
boot
Это должно позволить вам загрузиться с заданным загрузчиком.
Устранить проблему
Сначала я восстановил загрузчик systemd в соответствии с этим руководством. (Возможно, вам потребуется использовать приведенное выше быстрое исправление для загрузки вашей системы Linux)
Поскольку это не решило проблему, я загрузился в Windows и выполнил (от имени администратора )командную строку.
Я смонтировал свой раздел EFI, следуя этому руководству(Я смонтировал его в V :).
Тогда,Я добавил файл EFI как путь {bootmgr} и смонтированный раздел EFI как устройство в моей записи bcdedit {bootmgr}
.bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi
bcdedit /set {bootmgr} device partition=V:
Затем я перезагрузился (он снова загрузился прямо в Windows )и увидел, что запись устройства bcdedit {bootmgr} изменилась с partition=V:на partition=\Device\ HarddiskVolume2
Я снова перезагрузился, и это сработало. Так что, возможно, я мог бы напрямую установить устройство на partition=\Device\HarddiskVolume2 ... Однако это сработало для меня.