Мое предложение состоит в том, что вы должны использовать сценарий оболочки, который одновременно настроит файл журнала и запустит тестовый сервер с соответствующим перенаправлением, таким образом минуя настройку systemd StandardOutput=
, которая не работает. для вашего случая.
Создайте сценарий bash /etc/testServer/Debug/runTestServer.sh
следующим образом:
#!/usr/bin/env bash
timeStamp=$(date +%y-%m-%d_%Hh%Mm%Ss)
myfolder="/etc/testServer/Debug"
# create new logfile
touch $myfolder/started_$timeStamp
# remove old symlink if exists (owned by test1)
if [ -h $myfolder/test_outLink ]; then
rm $myfolder/test_outLink
fi
# create new symlink
ln -s $myfolder/started_$timeStamp $myfolder/test_outLink
# run the actual testServer
exec /etc/testServer/Debug/testServer >/etc/testServer/Debug/test_outLink
Единственное отличие от исходного сценария makeOutfile.sh
заключается в том, что этот сценарий выполняет testServer
с соответствующим перенаправлением для отправки своего стандартного вывода в только что настроенный файл журнала.
Он также использует exec
, чтобы убедиться, что сценарий оболочки не сохраняется и не заменяется на testServer
(, чтобы systemd знал, что является основным процессом службы.)
В вашем юнит-файлеудалите ExecStartPre=
и StandardOutput=
и замените ExecStart=
на:
ExecStart=/etc/testServer/Debug/runTestServer.sh
(Также возможен вызов скрипта с помощью /bin/bash
, хотя это и не обязательно, если в скрипте установлен исполняемый бит.)
Настроив свой сервер с помощью такого скрипта, вы даже можете полностью обойти символическую ссылку и выполнить перенаправление непосредственно на окончательный started_$timeStamp
лог-файл.
Я не просматривал код systemd напрямую, и в документации нет ясности относительно взаимодействия между StandardOutput=
и ExecStartPre=
в частности... Но определенно есть проблема с порядком выполнения шагов. by systemd (и какой процесс их выполняет, что приводит к различным разрешениям/владельцам ), поэтому я не слишком удивлен результатами, о которых вы сообщили. Я думаю, независимо от того, моя рекомендация состояла бы в том, чтобы упростить его с помощью одного сценария исполнителя-оболочки, так что, надеюсь, это решит вашу проблему.
Вы можете использовать решение @DopeGhoti, но добавить его в файл ~/history, после чего его можно будет отозвать и отредактировать.
cat input >> ~/history
^r <cmd>
^e
В zsh
для этого можно выполнить print -z "content"
.
Я смог создать функцию оболочки, которая делала то, что мне было нужно.
Пример здесь:
put_to_input() {
# Push command to current terminal input line with print -z
print -z $(cat $HOME/runfile)
}
$ cat $HOME/runfile
echo hehe
$ put_to_input
$ echo hehe # file contents appear on input line
Первоисточник :Может ли bash записывать в свой собственный входной поток?
В bash вы можете добавить содержимое любого файла в свою историю:
history -r file
После этого вам просто нужно нажать вверх -стрелку (так же, как Ctrl -p ), чтобы отредактировать и выполнить команды, или запустить их напрямую с помощью !
.
Пример:
$ echo '~bin/start.sh my=complicated -command=that must be "edited" all the time' > file
$ history -r file
$ history
1 echo '~/bin/start.sh my=complicated -command=that must be "edited" all the time' > file
2 history -r file
3 ~/bin/start.sh my=complicated -command=that must be "edited" all the time
4 history
$ !3
Running...