Хороший выбор! Вы могли бы хотеть прочитать документацию Debian относительно выбора. С веб-сайта Debian существует намного более категорическая информация, но выборка из документации суммирует его хорошо:
Если безопасность или устойчивость вообще важны для Вас: стабильная установка. период. Это - самый предпочтительный путь. Если Вы - новый пользователь, устанавливающий на настольной машине, запустите с конюшни. Часть программного обеспечения довольно стара, но это - наименее ошибочная среда для работы в. Можно легко переключиться на более современное нестабильное, после того как Вы немного более уверены. Если Вы - настольный пользователь с некоторым опытом в Linux, и не возражает стоять перед нечетной ошибкой время от времени, используйте нестабильный. Это имеет все последнее и самое большое программное обеспечение, и ошибки обычно исправляются быстро. Если Вы выполняете сервер, особенно тот, который имеет сильные требования устойчивости или выставляется Интернету, стабильная установка. Это - безусловно самый сильный и самый безопасный выбор.
Проблема с домашним разделом будет очень минимальна к, возможно, не существующему. UID/GID "старого" user/s мог бы измениться; но, это - простая фиксация: просто chown/chgrp к новому UID/GID.
Можно пойти от стабильного до тестирования к нестабильному, но не назад. Если устойчивые комплекты Вы и Ваши аппаратные средства, остановитесь там. В противном случае переключитесь на нестабильный. Ответвление тестирования иногда занимает долгое время (месяцы) для фиксации чего-либо, что повреждается.
Относительно проверки, если бы процесс уже работает, я изменил бы то, что Вы делаете немного и использование pgrep
вместо этого.
$ pgrep -f Connection_Manager.sh
$ pgrep -f Connection_Manager.sh
16293
-f
переключатель позволяет pgrep
соответствовать всей командной строке и не только первой части.
Для этого у Вас есть несколько методов. Вы могли попытаться анализировать их от вывода pgrep
также. Необходимо будет добавить дополнительный переключатель, -a
.
$ pgrep -af Conn
17306 /bin/bash ./Connection_Manager.sh arg1 arg2
Затем используйте awk
, sed
или что-то подобное для парсинга их вывода.
sed
$ pgrep -af ./Conn | sed 's/.*Connection_Manager.sh //'
arg1 arg2
awk
$ pgrep -af ./Conn | tr '\000' ' '| awk '{print $4, $5}'
arg1 arg2
Эти 2 метода первое, что пришло на ум, они могли несомненно быть оптимизированы.
Но в зависимости от количества аргументов и длины это могло вызвать, Вы выходите, если командная строка чрезмерно долга в длине. Таким образом, я, вероятно, пошел бы со вторым методом и проанализировал бы контент процесса cmdline
файл. Каждый процесс имеет ряд файлов в рамках Linux' /proc
файловая система, которая содержит метаинформацию о том процессе.
$ ls /proc/19146
attr cmdline environ limits mountinfo numa_maps personality stack task
autogroup comm exe loginuid mounts oom_adj root stat timers
auxv coredump_filter fd map_files mountstats oom_score sched statm wchan
cgroup cpuset fdinfo maps net oom_score_adj sessionid status
clear_refs cwd io mem ns pagemap smaps syscall
Один из этих файлов является файлом cmdline
. Но необходимо обратить особое внимание на содержание этого файла. Аргументы в этом файле разделяются символами NUL. Можно использовать cat -v <file>
видеть их в окне терминала.
$ cat -v cmdline
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@
Это занимает место ^@
вместо NUL's.
Так парсинг содержания может быть сделан во множестве путей, один метод обсужден в ответе @Joesph, с помощью xargs -0 ...
. Другой использует cat -v
.
xargs
$ xargs -0 < cmdline
/bin/bash ./Connection_Manager.sh arg1 arg2
кошка
$ cat -v cmdline
/bin/bash^@./Connection_Manager.sh^@arg1^@arg2^@
Можно использовать sed
к очистке этот 2-й метод немного.
$ cat -v cmdline | sed 's/\^@/ /g'
Если Вы находитесь в системе GNU/Linux с доступом к a proc
файловая система, вот то, как я сделал бы это:
already_running=0
for pid in $(pgrep Connection_Manager.sh);do
if xargs -0 </proc/$pid/cmdline | grep -q ... ;then # match arguments here
already_running=1
break
fi
done
if ! [ $already_running -eq 1 ];then
# run Connection_Manager.sh here
fi
Почему не просто на самом деле используют блокировку?
#!/bin/bash
if [[ -f /tmp/$0.lock ]]; then
echo "$0 is locked."
exit 1
else
touch /tmp/$0.lock
trap "rm -f /tmp/$0.lock" EXIT
fi
# The rest of the script
if pgrep $(basename $0) 2> /dev/null; then echo "Already running"; exit 1; fi
– DopeGhoti
25.12.2013, 09:25
Я записал сценарий блокировки, который уже обрабатывает это, включая проблемы безопасности tempfile владения. Работы даже под busybox.
Текущая версия, доступная по http://dev.gentoo.org/~robbat2/scripts/pidlock
Это действительно проверяет аргументы нормально с помощью/proc / */cmdline и нормально обрабатывает устаревший lockfiles. Это используется для нескольких сотен cronjobs, рассеянных по *.gentoo.org.
Использование в качестве примера, показывающее его работа:
$ ( /usr/local/bin/pidlock sleep 5 & ) ; sleep 0.1 ; /usr/local/bin/pidlock sleep 5
Error! 'pidlock-sleep' is running already!
(Сон 0.1 там, чтобы иметь в первый один раз для запуска.)