Перезапустите сценарий оболочки, если он не печатает

Если у вас есть Windows, по крайней мере, с административным ресурсом \\computer\c$и у вас есть Linux, который запустит скрипт:

Смонтировать общую папку Windows для чтения/записи

mount -t cifs $network_path $mount_directory -o credentials=$cred_file

Выполнить команду перемещения в смонтированном каталоге

mv "$mount_directory/*" "$new_directory"

Возможно, потребуется скопировать, а затем удалить файлы...

cp "$mount_directory/*"
rm "$mount_directory/*"

Проверьте переключатели, которые могут потребоваться для команд (cp, mvи rm).

2
11.10.2019, 04:51
1 ответ

Как мне удалось понять из ОП:

  • вы запускаете процесс my_script.py, но вы не можете предсказать завершение или время выхода.
  • процесс my_script.pyвыполняется и записывает в лог-файл (вызывайте его file.logдо тех пор, пока он не остановится.
  • Каждый небольшой интервал времени вы хотите проверять, не старше ли время последней модификации вашего файла журнала более 30 секунд. Если это так, убейте и заново -запустите процесс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

Я частично проверил это на bashv5.0.1. Сообщите о проблемах, если таковые имеются.ХТХ

0
27.01.2020, 22:24

Теги

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