Cześć,
mamy aplikację w Javie i serwer Linuxowy do którego jest dostęp przez ssh. Obecnie deploy polega na skopiowaniu aplikacji na docelowy host oraz uruchomienia aplikacji poprzez ssh.
Problem zaczyna się wtedy np. gdy chcemy zatrzymać aplikację itd. Ktoś musi znać PID tego procesu (jasne, że można robić pgrep, ale nie o to chodzi tutaj).
Pytanie brzmi, jak robić taki deploy "state of the art"?
Ja to bym zaczął od niewchodzenia z ręki na serwery żeby coś uruchamiać i ubijać, bo ani to state-of-the-art, ani najprościej - ręce sobie urobisz, łatwo o pomyłkę, jak ktoś napsuje to trudno zreprodukować i odgadnąć co się wydarzyło bez grzebania w logach systemowych i szukania winnego.
Od deploymentu na serwer powinien być system CI/CD, a nie człowiek. Człowiek może zapomnieć przetestować i wrzucić popsutą wersję, pomylić coś pod presją czasu, a może też wkurzyć się na firmę i celowo napsuć.
Są na pewno dwie opcje:
Odrzucasz z marszu dwie najbardziej normalne opcje 
- jako kontener docker - odpada
A byłoby spoko, bo mógłbyś prosto podnosić i ubijać aplikację w umiarkowanie izolowanym środowisku. Dlaczego docker odpada?
- jako usługa systemowa - odpada bo trzeba
sudo
To by była najprostsza opcja bez dockera i innych wodotrysków, by postawić serwer jako usługę która ma sama wstawać, restartować się i ewentualnie być wyłączana.
Opcji na obejście trzeba sudo masz kilka:
- Możesz stworzyć sobie
service account będący właścicielem tej usługi, i z jego poziomu nią zarządzać, mniej więcej: $ systemctl start --user <service>.service
- Dałoby się poczarować grupami i daniem uprawnień grupie do zarządzania usługą poprzez plik sudoers: https://unix.stackexchange.com/a/736119
Chyba najlepiej byłoby mieć faktycznie taki service account ew. z przydzieloną grupą (by ograniczyć mu uprawnienia do minimum) ale nie dawać ludziom wjazdu, by korzystali z niego bezpośrednio, tylko poprzez deployment job w CI/CD odpowiedzialny za wrzucanie nowej wersji aplikacji. Ewentualnie wyłączenie jej, jeśli to potrzebne.