17

私がやろうとしているのは、macsayコマンドを使用してテキストを話す前に設定された時間スリープするBashスクリプトを作成することです。

コマンドを実行してから端末を閉じて、設定した時間に音声が聞こえるようにしたいのですが。nohup、デタッチ、起動、およびプロセスをバックグラウンドで実行することを検討しましたが、これらのソリューションはすべて、ターミナルが閉じられるとプロセスが終了する結果になります。これを行うために、どういうわけかゾンビの子プロセスを作成する必要がありますか?最善の解決策は何ですか?ありがとうございました

# Simple Example of main code
sleep 10;
say hello;
exit;
4

8 に答える 8

13

Bashマニュアルのセクション3.7.6には、次のように書かれています。

シェルは、SIGHUPを受信すると、デフォルトで終了します。終了する前に、対話型シェルは、実行中または停止中のすべてのジョブにSIGHUPを再送信します。停止したジョブはSIGCONTに送信され、SIGHUPを確実に受信します。シェルがSIGHUP信号を特定のジョブに送信しないようにするには、シェルをdisown組み込み(88ページのセクション7.2 [ジョブ制御組み込み]を参照)とともにジョブテーブルから削除するか、を使用してSIGHUPを受信しないようにマークする必要がありますdisown -h

したがって、またはのいずれnohupかを使用するdisownと、トリックを実行する必要があります。または、次のことができます。

trap "" 1
sleep 10
say hello

その' trap'行は信号1、SIGHUPを無視します。おそらく「trap "" HUP」と書くこともできます。

于 2010-12-06T19:00:16.723 に答える
12
nohup yourscript.sh 10 "hello" &

#     ^your script  ^^your parameter 1
#                      ^^^^^^^your parameter 2

これにより、スクリプトがターミナルから切り離され、ターミナルが閉じたときにスクリプトが強制終了されることはありません。&最後に注意してください。通常どおり、スクリプトにパラメーターを渡すことができます。次に、yourscript.shは次のようになります。

#!/bin/bash

sleep $1;
say "$2";
exit;
于 2010-12-06T18:56:11.443 に答える
6

nohupとbackgroundを一緒に使用する必要があります。OS-Xでこれを試して、動作することを確認しました。

nohup ./say-hello.sh &
于 2010-12-06T18:57:01.500 に答える
6

すでに提案されているように、で開始しない場合は、そのようnohupに使用する必要がありますdisown...

$ ./say-hello.sh &
[1] 12345
$ disown -h %1

に渡すことができるように、ジョブ番号(上記の例の2行目、ジョブ番号は角かっこで囲まれ、もう1つはプロセスIDです)をメモする必要がありますdisown

于 2010-12-06T19:06:00.260 に答える
3
于 2010-12-06T20:18:34.530 に答える
1

All the solution here are very good, but they don't provide an easy way to "look" what happen in the program without doing a redirection that would fill the hard drive.

Using screen you can then very easily run a script, close your terminal/ssh session, and then come back latter, and "attach" again to the script. Do do that it's pretty easy.

Install

First install screen:

sudo apt-get install screen

Detach

and then put in your bash file

#!/usr/bin/env bash
screen -S myscreen -d -m bash -c 'ls; exec bash'

(replace ls with your program) It will create (-S) a "screen" named myscreen, and detach it (-d) by running the commands inside the ``-c``` option. Then if you want to connect later to this screen:

And attach later

screen -rd myscreen

if you want to list all screen currently running:

screen -ls

NB: if you want to close the screen when it's finished, remove the bash at the end of the command.

于 2017-03-30T23:11:37.810 に答える
0

'easy'の定義によっては、答えはデーモンになる場合があります。

于 2010-12-06T21:16:31.780 に答える
0

nohup yourscript.sh &Piskvorが提案したように使用します。

ただし、プロセスの「制御」を取り戻すことはできないことに注意してください。したがって、必要な場合は、プログラムが何をしているかがわかるように、ファイルにログを追加することをお勧めします。

あなたのプログラムを殺すことは、なしでは不可能かもしれませんkill -9、そしてそれは少し残酷かもしれません。それを望まない場合は、end.txt毎分程度のようにファイルをプールすることをお勧めします。プログラムが作業ディレクトリにそのようなファイルの存在を検出した場合、プログラムは正常に終了する必要があります。

于 2010-12-06T19:16:15.120 に答える