ターミナルを閉じた後でも、バックグラウンドでスクリプトを実行しようとしています。 Nohup
とdisown
を検索して試しましたが、どちらも機能していないようです。ターミナルウィンドウを閉じると、典型的なClosing this window will terminate the running processes: watch.
メッセージが表示されます。 Nohup
またはdisown
を使用している場合でも、バックグラウンドプロセスが終了します。何が問題なのですか?
私のコードは単純な2行です
cmd="Nohup watch -n 1 Sudo /etc/block.sh > /dev/null"
$cmd & # blocks automatically
新しい端末を開くたびに起動したいので、.bash_profile
にあります。
Sudoは無視してかまいません。パスワードを入力せずにSudoコマンドを実行する方法をすでに見つけました。
MacOSXを使用しています。
サブシェルを開始し、そこからNohup
コマンドを実行すると、終了時にターミナルがサブシェルを強制終了することを回避できるようです。
bash -c "Nohup sh -c 'while true; do date; sleep 1; done' &"
あまりエレガントではありませんが、私にとってはうまくいきます。
これはすでに回答済みですが、Screenユーティリティはこれに最適のようです。
man screen
画面のドキュメントを表示します。
www.ss64.com/osx/screen.html
は、もう少しユーザーフレンドリーなドキュメントを表示します。
名前と実行するスクリプトを使用して画面を開始します。
screen -S GWatch Scripts/gw_watch.sh
This starts a screen session named 'GWatch' and executes gw_watch.sh.
スクリーンセッションが開始されると、それから切断するオプションがあります。これにより、画面がバックグラウンドでアクティブなままになります。ユーザーがログアウトした後もアクティブなままになります(許可にかかわらず)。
次に例を示します。
以下をファイルに入れます(私はしばしばtextwranglerおよび/またはnanoを使用します)。
#!/bin/bash
count=0
while [ $count -lt $1 ] ; do
echo "Count: $count of $1. Pausing for five seconds."
sleep 5s
((count++))
done
2つのターミナルウィンドウを開きます。
screen -ls
と入力します。ソケットが見つからないというメッセージが表示されます。screen -S ScreenCheck screencheck.sh 500
と入力します。 screencheck.shは実行可能である必要があります。2番目のターミナルウィンドウに、次のように表示されます。
Count: 0 of 500. Pausing for five seconds.
Count: 1 of 500. Pausing for five seconds.
Count: 2 of 500. Pausing for five seconds.
...
ctrl-a d
と入力して、画面セッションから切断します。それはコントロール+ a、両方を離す、dキーです。[detached]
が表示されます。screen -ls
と入力します。次のようなものが表示されます。
FCH000: ~: screen -ls
There is a screen on:
1593.ScreenCheck (Detached)
1 Socket in /var/folders/pk/l6b5fhkj6mxfpfh8mtgmstg40000gn/T/.screen.
screen -R ScreenCheck
を使用して画面セッションに再接続します。
次のようなものが表示されます。
Count: 226 of 500. Pausing for five seconds.
Count: 227 of 500. Pausing for five seconds.
Count: 228 of 500. Pausing for five seconds.
Count: 229 of 500. Pausing for five seconds.
...
ログアウト後に実行されているかどうかを確認するには、ログアウトして、別のコンピューターからコンピューターにSSH接続します。 screen -ls
は、以前と同じ画面セッションを表示する必要があります。
これがお役に立てば幸いです。