나는 상당히 간단한 쉘 스크립트 패치 파일을 가지고 있습니다(기본적으로 일부 스크립트와 rpm이 모두 하나의 파일에 포함되어 있음). 잘 작동했지만 예상치 못한 문제가 발생했습니다. 사용자가 SSH 세션이 실행되는 동안 실수로 닫았습니다. 최종 결과는 이전 패키지가 제거되지 않는다는 것입니다.
원래 문제는 이제 해결되었지만 생각이 들었습니다. SSH 세션이 종료되더라도 스크립트를 계속 실행하고 SSH 세션을 통해 사용자에게 상태 업데이트를 계속 제공할 수 있는 쉬운 방법이 있습니까? 내가 그것을 사용하지 않은 원래 이유 nohup
는 그것이 사용자에게 보여주고 싶은 출력을 숨기거나 억제한다고 생각했기 때문입니다. 스크립트가 실행될 때 사용자가 상태 업데이트 등을 볼 수 있기를 바랍니다.
답변1
나는 다음과 같이 할 것입니다 :
nohup command > command.out 2>&1 & tail -f command.out
tail
죽지 않는 이상 절대 종료되지 않지만, 영원히 기다린다는 점을 명심하세요 -f
.
답변2
이미 제안한 대로 플래그를 사용하여 파일을 -f
계속 tail
해서 읽으세요 nohup.out
. 또 다른 가능성은 입니다 named pipes
.
예:
# make a named pipe first
xieerqi@eagle:~$ mkfifo /tmp/mypipe
# redirect command there
xieerqi@eagle:~$ nohup bash -c "while [ 1 ] ; do df > /tmp/mypipe ; sleep 3;done " &
[1] 14425
xieerqi@eagle:~$ nohup: ignoring input and appending output to ‘nohup.out’
# Now cat the pipe
xieerqi@eagle:~$ cat /tmp/mypipe
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 115247656 83099216 26271092 76% /
none 4 0 4 0% /sys/fs/cgroup
udev 2914492 4 2914488 1% /dev
tmpfs 585216 1152 584064 1% /run
none 5120 0 5120 0% /run/lock
none 2926072 98008 2828064 4% /run/shm
none 102400 76 102324 1% /run/user
또 다른 예 - dbus-monitor
계속해서 실행하고 named pipe
이전 명령의 나머지 출력을 기록해 둡니다. 삭제해야 할 수도 있음echo "" > /tmp/mypipe
xieerqi@eagle:~$ nohup dbus-monitor > /tmp/mypipe &
[1] 14695
xieerqi@eagle:~$ cat /tmp/mypipe
nohup: ignoring input and redirecting stderr to stdout
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 115247656 83099512 26270796 76% /
none 4 0 4 0% /sys/fs/cgroup
udev 2914492 4 2914488 1% /dev
tmpfs 585216 1152 584064 1% /run
none 5120 0 5120 0% /run/lock
none 2926072 98012 2828060 4% /run/shm
none 102400 76 102324 1% /run/user
signal sender=org.freedesktop.DBus -> dest=:1.115 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.115"
method call sender=:1.115 -> dest=org.freedesktop.DBus serial=3 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "eavesdrop=true,type='method_call'"
method call sender=:1.115 -> dest=org.freedesktop.DBus serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "eavesdrop=true,type='method_return'"
method call sender=:1.115 -> dest=org.freedesktop.DBus serial=5 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "eavesdrop=true,type='error'"
signal sender=org.freedesktop.DBus -> dest=(null destination) serial=99 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.116"
string ""
string ":1.116"
답변3
시작하다화면회의. 대부분의 스크립트는 스크립트가 완료되면 종료되는 Screen 세션에서 실행됩니다. (선택 사항) 스크린 세션이 완료된 후 성공/실패 보고서를 인쇄합니다.
사용자가 (자발적으로 또는 비자발적으로) 연결을 끊으면 스크립트는 방해 없이 계속 실행됩니다. 사용자가 연결을 끊지 않는 한 계속해서 스크립트의 출력을 보고 상호 작용할 수 있습니다(예: Ctrl+ 로 종료 C). 연결이 끊어지면 Screen 세션을 다시 연결하여 다시 연결할 수도 있습니다.
답변4
nohup ls -l
#nohup: ignoring input and appending output to ‘nohup.out’
#total 44
#-rw-r--r-- 1 mikeserv mikeserv 2550 Nov 3 15:03 file
#-rw-r--r-- 1 mikeserv mikeserv 10 Nov 10 06:36 file1.tsv
#-rw-r--r-- 1 mikeserv mikeserv 10 Nov 10 06:36 file1.txt
#-rw-r--r-- 1 mikeserv mikeserv 10 Nov 10 06:36 file2.tsv
#-rw-r--r-- 1 mikeserv mikeserv 10 Nov 10 06:36 file2.txt
#-rw-r--r-- 1 mikeserv mikeserv 5 Nov 11 09:06 filea.xyz
#-rw-r--r-- 1 mikeserv mikeserv 5 Nov 11 09:06 fileb.xyz
lrwxrwxrwx 1 mikeserv mikeserv 8 Nov 14 19:56 nohup.out -> /dev/tty
#drwxr-xr-x 2 mikeserv mikeserv 80 Nov 13 17:31 one