Ответы пользователя по тегу bash
  • Не работает команда в bash скрипте, где ошибка?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Смотреть PATH нужно не из вашей сессии, а прямо из cron.
    Когда юзер логинится интерактивно, выполняются его персональные профайлы - .profile, .bashrc, .login и др.

    Крон же просто запускает с правами указанного юзера, не читая его профайлы.

    Варианты как это чинить:
    1. Использовать в скриптах полные пути к файлам
    2. Задать PATH прямо в вашем скрипте
    3. Задать PATH в самом кронтаб вначале, например

    PATH=$PATH:/home/user/mypersonalbin/
    00 09 * * * /mnt/pve/backups/sensors.sh >> /root/myscript.log 2>&1


    crontab формат позволяет задавать переменные, которые будут работать для всех скриптов запускаемых из вашего кронтаба.
    Ответ написан
  • Запуск js скрипта в фоновом режиме через команду nohup?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    потому что эотт js скрипт не является исполняемым файлом. Его нужно запускать чем-то, например nodejs
    как питон запускается
    python myscript.py
    так и js надо
    node myscript.js

    или nohup node myscript.js &

    ну или прописать через шебанг путь к ноде и сделать файл исполняемым.
    Ответ написан
    Комментировать
  • Поясните пожалуйста bash скрипт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    кода done < <(ls -1 "./my_temp_dir/")

    ls -1 выводит содержание каталога в одну строку по одному наименованию
    <(blabla) создает из команды поток, который передается как файловый десктриптор
    < перенаправление данных из файлового дескриптора в предыдущую команду
    done является частью цикла, поэтому перенаправление идет не в done а в весь блок цикла.
    Ответ написан
    Комментировать
  • Можно ли к результатам поиска, выведимых в файл, добавлять размеры найденного?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Юзай find и stat. Можно через stat вообще все аттрибуты файла смотреть:

    sudo find / -iname "log" -o -iname "logs" -exec stat -c "%n %s" {} \;
    Ответ написан
    Комментировать
  • Как с помощью SED вставить слово в кавычках?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    sed -i -r 's/^CONFIG="(.*) OUTPUT"/CONFIG="\1 OUTPUT CONSOLE"/g' file.txt


    Пример:
    $ echo 'CONFIG="USER OUTPUT"'|sed -r 's/^CONFIG="(.*) OUTPUT"/CONFIG="\1 OUTPUT CONSOLE"/g'
    CONFIG="USER OUTPUT CONSOLE"
    Ответ написан
  • Ошибка sed, почему?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Я думаю в профайле пользователя задается определенная локаль, которая позволяет работать нормально с кодировкой, а через crontab она не задается.
    Посмотрите еще раз ваш .profile, .bashrc и настройте такое же для крона.
    Ответ написан
    Комментировать
  • Как в скрипте на bash войти под другим логином?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    sudo su -l user -c 'pip3 install --user bs4 lxml requests'


    под sudo, команда su не будет запрашивать пароль.
    Ответ написан
    7 комментариев
  • Как вы понимаете работу следующей команды?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Это ответ начала установки tcp соединения?

    Нет конечно, это уже ответ от вашего TCP сервера. Скорее всего там какой-то простое приложение которое по telnet протоколу в ответ на PING возвращает вам "PONG"
    Ответ написан
  • Как поднять сервис с помощью bash скрипта?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Файлы вроде как у вас везде заданы с полным путем, но я подозреваю, что при запуске крона PATH не содержит всего чего нужно
    В идеале было бы просто добавить в кроне скрипт с перенаправлением вывода ошибок и посмотреть логи, типа так

    Попробуйте либо прописать полный путь к iconv и grep либо добавить в кроне перенаправление вывода в лог и посмотреть на что ругается скрипт
    1 * * * * /bin/sh /home/user/script.sh>>$HOME/script.log 2>&1
    Ответ написан
    Комментировать
  • Как правильно реализовать continuous deployment для запуска миграций?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Ну все руками делается.
    Делаете каталог для файлов миграции и в нем какой-то главный типа control.sh
    в control.sh инклюдите актуальные файлы миграции
    Для дедупликации проще всего в базе сделать таблицу, в которую при миграции добавляется "дата, имя скрипта миграции, статус (completed/failed), и при выполнении скрипта миграции соответствнено он проверяет по базе выполнялся уже или нет, чтобы не запускаться вторично. Может быть какие-то скрипты наоборот нужно прогонять каждый раз, тогда можно в таблицу добавить колонку для такого флага.

    И все. При автодеплое конкретной версии - в ее ветке оно найдет в control.sh список миграционных скриптов, control.sh через базу данных может перепровить надо ли их запускать или пропустить, если они уже выполнились, или выполнить независимо от этого и сделает запись в базу о выполнении.

    Естественно контроль - ответственность разработчиков, магии тут не будет. И предполагается, что вы всегда деплоите более позднюю версию поверх старой.
    Ответ написан
    Комментировать
  • Как запустить функцию в bash из командной строки?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    1. Просто выполнить функцию в командной строке.

    2. Добавить ее в .bashrc или в .profile, чтобы она загружалась при логине

    3. Выполнить ваш скрипт с функцией в текущей оболочке, она будет доступна после этого (
    $ source script_with_function.sh
    $ Autobak
    Ответ написан
    3 комментария
  • Как слайсить массив на баше?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    declare -a array=( a b c d e f g h i j k l m n o p q r s t u v w x w z a b c d e f g h i j k )
    declare -i j=1 k=6
    
    for item in ${array[@]}; do
      j+=1
      printf "$item "
      if [ $j -gt $k ]; then
        printf "\n$k"
        k=$k+6
      fi
    done


    >bash.exe a.sh
    a b c d e f
    6
    g h i j k l
    12
    m n o p q r
    18
    s t u v w x
    24
    w z a b c d
    30
    e f g h i j
    36
    k
    Ответ написан
    Комментировать
  • Почему для скриптинга в шелле используется bash а не более современный язык программирования?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Насколько я понимаю раньше шеллы использовались в качестве примитивных высокоуровневых языков. Сейчас у нас есть Perl, Python, nodejs, php...


    Ну давайте вместо рабочего стола пользователю дадим сразу Visual Studio, ведь какая разница как программу запускать - иконкой на рабочем столе, или форкать из высокоуровневого языка?

    shell - это оболочка операционной системы. То, что кроме графической есть еще и command line interface - это совершенно нормально и адекватно. И шелл позволяет пользователю и администратору работать в операционной системе гораздо удобнее, чем через язык программирования.

    То, что sh/bash и другие, настолько развиты что сами по себе являются неплохими языками программирования - это просто следствие того, что командый интерфейс и создавался тогда, когда каждый пользователь был немного программистом, и следствие того, что cmd line удобен для автоматизации просто по своей архитектуре.
    Поэтому Powershell, bash/zsh/ksh будут продолжать развиваться.

    Но ты можешь попробовать писать всю автоматизацию на любом другом языке программирования. И со временем немного столкнуться с тем, что скрипт, написанный на шелл 10 лет назад - просто работает, а скрипт написанный на питон 10 лет назад - несовместим.
    Ответ написан
    42 комментария
  • Как понять значение этой строки?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    каждая команда после завершения возвращает код возврата.
    для if важно не сравнение чего-либо с чем-либо, а именно код возврата команды, который 0 - успех, не ноль - ошибка.
    поэтому if [ A == B ] - это не сравнение а выполнение команды[ ]
    так и тутif ping - это не сравнение, а выполнение команды pingи получение ее кода возврата

    > /dev/null 2> /dev/null
    > - перенаправление вывода stdout в нул
    2>перенаправление вывода stderr в нул
    Это чтобы на экран команда ничего не выводила - ни основной вывод ни ошибки

    p.s. посмотреть код возврата можно через переменную $?
    ping -c 1 google.com
    echo $?
    
    ping -c 1 google.com1
    echo $?
    Ответ написан
    1 комментарий
  • Что означает данная команда в конце Dockerfile?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    я думаю это строка не имеет смысла. Бесконечный слип в фоне, и ожидание пока завершится фоновая задача.
    Вместе - сложно понять какой конкретный смысл в таком сочетании.
    Ответ написан
    3 комментария
  • Как скопировать в несколько потоков?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Написал скрипт который по отдельности сжимал папки и копировал на удалённый сервер там распаковывал

    Так сжимайте сразу на удаленный сервер

    tar cvfz - mydirectory|ssh user@remote_server "cd target_directory;tar xvfz -"


    Или даже проще будет запустить несколько экземпляров rsync в фоне через xargs или parallel
    Ответ написан
    7 комментариев
  • Как сделать пинг в BASH?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Пингайте разовыми пингами и проверяйте код возврата в переменной $?: 0 успех, не 0 - ошибка связи.
    ping mysite.com -c 1
    echo $?


    После обсуждения в камментах, вот вам скрипт помощнее:
    declare -i failcount=0
    status="OK"
    
    while true: do
        if ping mysite.com -c 1; then
            if [ "$status" == "FAIL" ]; then
                echo "Network is restored"
                curl -X GET -k "https://api.telegram.org/bot1938&text=Connection_is_restored"; 
                status="OK"
            fi
            failcount=0
        else
            failcount+=1
            if [ "$status" == "OK" ] && [ $failcount -gt 60 ] ; then
                echo "Network is unavailable for 60 seconds!!!"
                curl -X GET -k "https://api.telegram.org/bot1938&text=Connection_broken_for_60_seconds"; 
                status="FAIL"
            fi
        fi
    done
    Ответ написан
    Комментировать
  • Как дописать Автозапуск Plex?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Если есть скрипт, который делает вообще другие вещи, зачем именно его нужно менять?
    Просто напиши другой скрипт.
    Умеешь немного писать и что-то не получается - задай конкретный вопрос.
    Не умеешь писать вообще ничего - обратись на фриланс.
    Ответ написан
    Комментировать
  • Как реализовать парсинг параметров, введённых в произвольном порядке?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Есть три способа
    Просто сделать свой цикл, который бежит по всем аргументам
    Второй - встроенный getopts
    Третий - правильный getopt. Он умеет и в длинные и короткие опции.

    Вот накидал правильный пример для getopt вроде как все как рекомендовано.
    Указаны доступные короткая опция -h и длинные --help и --start, при этом --start требует дополнительного аргумента.

    function usage {
      echo "        Syntax:"
      echo " $0 -h"
      echo " $0 --help"
      echo " $0 -start <environment>"
    }
    OPTSTR=$(getopt --name $0 --options h --longoptions help,start: -- $@)
    [ $? -ne 0 ] && echo "ERROR: wrong option" && usage && exit 1
    [ $# -eq 0 ] && echo "ERROR: no arguments" && usage && exit 1
    
    eval set -- "${OPTSTR}"
    # parse all arguments.
    while true; do
      case "${1}" in
        -h|--help)  usage; exit 0;;
        --start) ENV="${2}"; shift 2;;
        --)         break;;
        *)          echo "ERROR: unknown"; usage; exit 1;;
      esac
    done
    
    echo "Starting program with environment: ${ENV}"
    Ответ написан
    2 комментария
  • Как переписать данный кусок кода под BASH?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Может вам вообще не нужно городить эти все циклы, а просто почитать справку по rsync и сделать все рсинком?
    Он может и папки сравнить и скопировать и файл сгенерировать.
    Ответ написан
    Комментировать