Используйте sort
, чтобы отсортировать их по первому полю, а затем по второму полю в порядке убывания числовых значений. Используйте Awk для печати только первой строки для каждого отдельного значения первого поля.
sort -k1,1 -k2rn inputfile | awk '!a[$1]++'
Основная проблема, которую вы видите, заключается в том, что OpenVPN остается запущенным, поэтому ваш sudo openvpn /etc/openvpn/connection1.ovpn
никогда не возвращается. Таким образом, ваш скрипт никогда не перейдет к следующей строке. (Также: скрипты init запускаются от имени root, поэтому там не должно быть sudo
). Итак, тривиально, вам нужно добавить амперсанд (&
) в конец этой строки или, что еще лучше, дать OpenVPN опцию --daemon
(но прочитайте документацию OpenVPN об ограничениях этого).
Конечно, вы должны просто использовать способ Debian для включения VPN: на Jessie это будет systemctl enable openvpn@connection1.service
. На предыдущей версии Jessie, или на Jessie без systemd, это будет редактирование /etc/default/openvpn
и изменение строки AUTOSTART
. (Возможно, вам также потребуется изменить расширение с .ovpn
на .conf
).
Затем вы столкнетесь со следующей проблемой: OpenVPN вернет до VPN. Но вы не можете запустить монтирование, пока VPN не начнет пропускать трафик. Самый простой способ, который я нашел для решения этой проблемы - это служба systemd, которая пингует удаленный конец VPN:
$ cat vpn-really-up.service
[Unit]
Description=Ping Einstein to make sure the VPN is really up
Wants=openvpn@vpn-name.service
After=openvpn@vpn-name.service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/ping -c 2 -w 300 192.168.X.Y
TimeoutStartSec=330
Конечно, вы можете использовать эту строку ping и в сценарии init.d. (Обратите внимание, что это может быть не лучший способ сделать это - например, может быть, команда --route-up
была бы лучше - не уверен, существовали ли они, когда я устанавливал это, или я не знал о них. На моей машине идет тестирование.)
Затем вы можете создать systemd mount units для вашей файловой системы (обратите внимание, что этот параметр также зависит от dnsmasq, потому что я использую его для перенаправления некоторых доменов на DNS-сервер через VPN, чтобы внутренние имена работали):
$ cat mnt-Einstein-music.mount
[Unit]
Description=/mnt/Einstein/music
Requires=dnsmasq.service vpn-really-up.service
After=dnsmasq.service vpn-really-up.service remote-fs-pre.target
[Mount]
Where=/mnt/Einstein/music
What=Einstein.home:/srv/music
Options=nosuid,nodev,intr,rsize=4096,wsize=4096,nfsvers=3,fsc
Type=nfs
TimeoutSec=180s
[Install]
WantedBy=multi-user.target
(Mount on use тоже подойдет, и это на самом деле довольно просто с systemd - смотрите man 5 systemd.automount
).
Наконец, ваша цель остановки нуждается в исправлении: вы должны размонтировать файловые системы перед остановкой VPN. Иначе ваша машина зависнет при перезагрузке/выключении. И вы должны проверить, что это работает - иначе однажды вы войдете в машину и перезагрузите ее, и вам придется совершить незапланированную поездку, чтобы нажать кнопку перезагрузки.
PS: У меня также есть этот файл:
$ cat openvpn@.service.d/local-after-ifup.conf
[Unit]
Requires=networking.service
After=networking.service
... я предполагаю, что в какой-то момент это было необходимо, чтобы убедиться, что OpenVPN (и, следовательно, все файловые системы over-VPN) остановлены до того, как systemd остановит сетевые интерфейсы.
Коротко Обновить.
OPENVPN теперь работает нормально, спасибо.
Последнее, над чем мне нужно поработать, это:
$ cat mnt-SHAREDNAS.mount
[Unit]
Description=/mnt/SHAREDNAS
Requires=vpn-really-up.service
After=vpn-really-up.service remote-fs-pre.target
[Mount]
Where=/mnt/SHAREDNAS
What=//192.168.50.10/Users/RsyncNAS/SharedNASData
Options=uid=root,credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm 0 0
Type=cifs
TimeoutSec=180s
[Install]
WantedBy=multi-user.target
Но mount возвращается с ошибкой (22): недопустимый аргумент.
Итак, мой вопрос: как правильно преобразовать эту строку fstab ниже в правильный файл .mount:
//192.168.50.10/Users/RsyncNAS/SharedNASData /media/SHAREDNAS cifs uid=root,credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm 0 0