次のようなシェルスクリプトがあります。
#!/bin/bash
# Here is where I set a bunch of environment variables that are
# used by the process invoked below...
# Now I want to invoke the process in the background and redirect
# all of the output to a log file.
nohup name-of-executable > logfile.out 2>&1 &
# Finally, I record the PID of the process before the script exits.
echo $! > proc.pid
ユースケースは、誰かがSSHでこのシステムに定期的にアクセスしてこのプロセスを開始し、システムからログオフすることです。プロセスの実行中に発生するすべての問題をデバッグできるようにログファイルを生成するだけです。
上記のスクリプトを使用すると、プロセスが正しく実行され、ログファイルが生成されますが、ログファイルに出力が書き込まれません。長さ0のファイルを受け取りました。
nohup name-of-executable > logfile.out 2>&1 &
コマンドラインから直接コマンドを実行すると、プロセスが期待どおりに実行され、データが書き込まれます。シェルスクリプトの一部としてこれを実行する方法がわかりません。
ベストアンサー1
nohupの代わりにscreenを使うのはどうですか?このようにバックグラウンド処理を行うことができます
screen -d -m /bin/bash 'name-of-executable > logfile.out 2>&1'
nohup
これは、バックグラウンドタスクで何が起こっているのかについてのアイデアを提供するため、実際よりも優れています。コマンドを実行screen -ls
してすべてのタスクのリストを確認し、screen -r screen_identifier
そのバックグラウンドタスクの対話型シェルに直接移動できます。詳細については、入力してくださいman screen
。