이것은 대답될 수 있다SSH를 통해 스크립트를 계속 실행하세요., 슈퍼유저로 명령을 실행할 필요가 없는 경우. 예를 들어 보겠습니다. 내 서버에 다음 스크립트 ~/testsleep.sh
도 있다고 가정해 보겠습니다 chmod +x
.
#!/usr/bin/env bash
logger Pre sleep: "$USER" / "$USERNAME" / "$1"
sleep 5
logger Post sleep: "$USER" / "$USERNAME" / "$1"
stdout/stderr이 손실될 수 있으므로 로그인 logger
하고 싶습니다 ./var/log/syslog
ssh
ssh
로컬 PC에서 이 프로그램을 실행하고 원격 서버를 통해 로그인한다고 가정해 보겠습니다.
server$ readlink -f ~/testsleep.sh
/home/user/testsleep.sh
server$ $ ls -la testsleep.sh
-rwxr-xr-x 1 user user 126 2015-02-05 13:35 testsleep.sh
server$ sudo /home/user/testsleep.sh some_argument
sudo: unable to execute /home/user/testsleep.sh: No such file or directory
sudo
첫 번째 문제는 다음을 사용하여 스크립트를 직접 실행할 수 없다는 것입니다.현재 쉘이 일반 사용자 ID로 실행 중이며 루트 액세스 권한을 부여할 수 없습니다."sudoPermissions_shell_Stack을 사용하여 현재 쉘에서 쉘 스크립트 실행
알았어, 알았어, 달려갈게 sudo bash
. 그러면 다음과 같이 보일 거야.
server$ sudo bash /home/user/testsleep.sh some_argument
server$ tail -2 /var/log/syslog
Feb 5 13:40:48 user user: Pre sleep: root / root / some_argument
Feb 5 13:40:53 user user: Post sleep: root / root / some_argument
분명히 스크립트가 로그인 하고 예상 대로 syslog
표시됩니다 . 여태까지는 그런대로 잘됐다.root
$USER
ssh
이제 터미널 세션을 종료하기 전에 이 스크립트를 서버의 프로세스로 실행하고 싶습니다 . 나는 이렇게 할 것 같아요:
server$ sudo bash /home/user/testsleep.sh from_end & exit
[1] 6293
logout
Connection to 127.1.100.99 closed.
local$
서버에 다시 로그인하여 syslog
다시 확인하면 마지막 "exit" 호출에 로그가 없음을 알 수 있습니다.
# this `grep` will print the filename, if file doesn't contain the match:
server$ grep --files-without-match 'from_end' /var/log/syslog
/var/log/syslog
server$ tail -2 /var/log/syslog
Feb 5 13:40:48 mypc user: Pre sleep: root / root / some_argument
Feb 5 13:40:53 mypc user: Post sleep: root / root / some_argument
그래서 내 질문은 - 이 스크립트를 서버의 sudo에서 프로세스로 실행하는 방법입니다. 그러나 ssh
쉘에서 호출하고 종료하기 전에 실행되도록 합니다(이 경우 를 작성하여 확인합니다 syslog
).
답변1
disown
연결이 "중단"되어도 종료되지 않도록 하려면 다음이 필요합니다 .
sudo bash /home/user/testsleep.sh from_end & sleep 1; disown -h; exit
그 sleep 1
목적은 백그라운드 작업 시작과 셸 종료 간의 경쟁을 줄이는 것입니다. 한 줄에 모든 작업을 수행하지 않으려면 두 명령 세트를 분리하여 더 나은 결과를 얻을 수 있습니다.
sudo bash /home/user/testsleep.sh from_end &
disown -h; exit