私はかなり単純なシェルスクリプトパッチファイルを持っています(基本的に、いくつかのスクリプトとrpmの両方が1つのファイルに含まれています)。うまくいきましたが、予期しない問題が発生しました。 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