misc/class
lib/jquery_pnotify, lib/moment, lib/lodash, misc/notification, site/engine, misc/social
if( $.browser.msie && $.browser.version <= 8 ) include('lib/respond'); $._social.__cfg = {"init":[{"service":"basic"},{"fb_app_id":"1997094873850041","service":"fb"},{"vk_app_id":"2978320","service":"vk"},{"service":"twi"}],"like":[{"service":"fb"},{"service":"vk"},{"via":"","channel":"","hash_tag":"","service":"twi"}]}; window._SiteEngine = new classes.SiteEngine( { user_id: 0, controller: 'content_tape', action: 'tag', content_css_version: '1459538664', social_enabled: 0} );

Faiwer

Блог web-программиста

Поиск по метке: linux

How to make a simple system.d service for a node.js server

21 февраля 2023

Put this content:

[Unit]
Description={name}

[Service]
Type=simple
User={user}
ExecStart=/usr/bin/node {full-path-to-script}.js

[Install]
WantedBy=multi-user.target

... somewhere as {name}.service, where:

  • {name} is the name of the service
  • {user} is the name of the user to run the script (optional)

... then:

  • run: this sudo ln -s /{full_path}/{name}.service /lib/systemd/system/{name}.service 
  • then this: sudo systemctl daemon-reload
  • then this: sudo systemctl enable {name}.service
  • and finally this: sudo systemctl start {name}

How does it work?

  • It starts the service on boot (see WantedBy section).
  • Using ExecStart command. Important: we specify the full path to node
  • SystemD remembers the PID of the new process and considers the service is ongoing until the process is died.
  • So any subsequent systemctrl start {name} won't do anything if the previous process is alive.
  • This behavior is determined by Type=Simple

Custom English-German layout for Ubuntu

24 ноября 2019

German language contains some extra latin symbols that English language doesn't: ä, ö, ü, ß. But if you choose German keyboard layout instead of English you get some keyboard keys moved to unusual positions. If it's okay for you then you don't need to do anything with it. Just get used to the new layout! But if you wanna stay with the English version of latin keys positions you need to find some convenient way to type German specific letters.

Under the cut 3 ways to handle it:

  1. Compose key
  2. International layout with "dead keys"
  3. Write your own EN-layout

подробности…

Пара мелочей о терминале в Linux

14 февраля 2017

История и дубликаты

Чтобы, во время листания истории введённых команд (стрелками на клавиатуре), терминал не предлагал вам одни и те же строки-дубликаты добавьте к .bashrc это:

export HISTCONTROL=ignoreboth:erasedups

Autocomplete

Если у вас имеется некий большой скрипт, и вы всё никак не можете уложить в голове все его многочисленные параметры, то можно создать свой собственный autocomplete-список для этого скрипта/программы. Сами скрипты обычно кладутся в ~/.bash_completion.d,  но это зависит от настроек вашей системы и профиля. Можно сделать, к примеру так (.bashrc):

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . your_script's_path
fi

Где вместо your_script's_path путь к вашему скрипту. В самом скрипте уже может быть всё что угодно. Самый простой вариант с заранее заготовленными строками для автокомплита (бездумного):

complete -W "option1 option2 option3" your_program

Это приведёт к тому, что вбив "your_program " и нажав Tab дважды вам будут предложены все три опции. Если же нужно что-то хитрее, например специфическую фильтрацию, то можно указать отдельный метод, для обработки уже введённых символов. Или, скажем, вам может потрбоваться в качестве списка вариантов список директорий/файлов в каком-то конкретно заданном месте.

_your_program()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W " $( ls some_directory's_path )" -- $cur) )
}
complete -F _your_program your_program

Этот код позволит по Tab-у получать в помощь список файлов из some_directory's_path.

#!/bin/sh

Столкнулся с тем, что указывая вначале bash-скриптов этот интерпретатор, часть правильно записанных bash-команд не срабатывает, а ругается с ошибками. Оказалось всё дело в том, что в Ubuntu-based дистрибутивах в качестве sh-интерпретатора используется некий dash, и он не в полной мере совместим с bash. Поменяв sh на bash в этой строке проблемы испарились.

В моём случае dash ругался на:

DIR=$(dirname "$(readlink -f "$0")")

Эта строка, кстати, аналог получения __dirname.

 

Как докачать файл на сервер, если scp-ssh-соединение разорвалось?

20 января 2017

Положим вы закачивали на сервер большой файл. Но с дуру выключили на ночь компьютер. Или, скажем, у вас отключили интернет. Или свет. Да мало ли что. Как докачать файл? Оказалось очень просто и без бубнов:

rsync --partial --progress -rsh=ssh %file% %destination%

 Формат для %file% и %destination% тот же, что и у scp. Как всегда, спасибо stackoverflow.

Как удалить мёртвый deb-пакет (YandexDisk)

17 ноября 2016

Случилось так, что неудачное обновление YandexDisk-а, либо же их кривые dpkg-скрипты поломали мне пакетный менеджер (dpkg). Его просто парализовало. Пришлось его насильно убивать (sudo killall -9 dpkg), пытаться починить (dpkg --configure -a), но тщетно. Обновил данные с репозиториев (sudo aptitude update), и попробовал просто обновить сами пакеты (sudo aptitude upgrade). Тщетно, оно почти на любой операции дохнет на попытке обработать пакет yandex-disk. Попробовал его remove и purge. Не шмогло оно. Попробовал напрямую через dpkg, тщетно. Попробовал даже чёрную магию (sudo dpkg --remove --force-remove-reinstreq yandex-disk) всё равно зависает. 

Старый добрый stack-overflow подсказал, что в таких случаях нужно править сами install-скрипты. Нужным оказался этот: /var/lib/dpkg/info/yandex-disk.prerm. Внутри буквально 1 строка. В ней killall -qw yandex-disk. Обратите внимание на флаг w. Wait. Оно ждёт смерти yandex-disk, который у меня не был запущен. Ждёт вечно. Руками убрал эти флаги и повторно заpurge-ил пакет. На этот раз всё прошло без запинки.

Дааа. Linux пока ещё сильно далёк от user-friendly интерфейсов. Как бы такую проблему смог бы самостоятельно решить не IT-ик я не представляю.