回答:
「nohup」プログラムをチェックしてください。
nohup command > /dev/null 2>&1 &
して、stdoutまたはstderr出力を作成せずにバックグラウンドで実行できます(nohup.out
ファイルなし)
nohup
この場合は役に立ちません。Ctrl+Z
/ をいじる方法はありbg
ますか?
GNU Screenの使用をお勧めします。すべてのプロセスの実行を継続しながら、サーバーから切断できます。私はそれが存在することを知る前に、それなしでどのように生活していたのかわかりません。
セッションが閉じられると、プロセスはSIGHUPシグナルを受信しますが、それは明らかにキャッチしていません。nohup
プロセスの起動時にコマンドを使用するかdisown -h
、プロセスの開始後にbash組み込みコマンドを使用して、これが発生しないようにすることができます。
> help disown
disown: disown [-h] [-ar] [jobspec ...]
By default, removes each JOBSPEC argument from the table of active jobs.
If the -h option is given, the job is not removed from the table, but is
marked so that SIGHUP is not sent to the job if the shell receives a
SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all
jobs from the job table; the -r option means to remove only running jobs.
デーモン化?だめ?画面?(tmux ftw、画面はジャンクです;-)
他のすべてのアプリが最初から行っていることを実行してください-ダブルフォークです。
# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid: 1
# jobs
# disown
bash: disown: current: no such job
バン!完了:-)私は、あらゆる種類のアプリと多くの古いマシンでこれを数え切れないほど使用しました。リダイレクトと組み合わせて、プロセスとの間にプライベートチャネルを開くことができます。
coproc.shとして作成します。
#!/bin/bash
IFS=
run_in_coproc () {
echo "coproc[$1] -> main"
read -r; echo $REPLY
}
# dynamic-coprocess-generator. nice.
_coproc () {
local i o e n=${1//[^A-Za-z0-9_]}; shift
exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <<COPROC "${@}"
(("\$@")&) <&$i >&$o 2>&$e
$n=( $o $i $e )
COPROC
}
# pi-rads-of-awesome?
for x in {0..5}; do
_coproc COPROC$x run_in_coproc $x
declare -p COPROC$x
done
for x in COPROC{0..5}; do
. /dev/stdin <<RUN
read -r -u \${$x[0]}; echo \$REPLY
echo "$x <- main" >&\${$x[1]}
read -r -u \${$x[0]}; echo \$REPLY
RUN
done
その後
# ./coproc.sh
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main
そして、あなたは行きます、何でもスポーンします。<(:)はプロセスの置換を介して匿名パイプを開きますが、これは終了しますが、ハンドルがあるためパイプはそのまま残ります。私は通常行うsleep 1
代わりにし:
て、わずかに際どいので、私は「ファイル使用中」エラーを取得したい-実際のコマンドが実行された(例えば、ある場合に起こることはありませんcommand true
)
「ヘレドックソーシング」:
. /dev/stdin <<EOF
[...]
EOF
これは、busybox / etc(initramfs)を含め、これまでに試したすべてのシェルで機能します。私はそれが以前に行われたのを見たことがない、私はソースを渡すことができることを知っていた誰がソースを引数にとることができるか知っていたときに、それを独立して発見しましたか?しかし、そのようなことがあった場合、それはしばしばevalのはるかに扱いやすい形式として機能します。
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)
nohup blah &
何とかしてプロセス名を置き換えてください!
他の人が指摘したように、SSHセッションから切断できるようにバックグラウンドでプロセスを実行するには、バックグラウンドプロセスを制御端末から適切に切り離す必要があります。これは、SSHセッションが使用する疑似ttyです。
デーモン化プロセスに関する情報は、Stevensの「Advanced Network Program、Vol 1、3rd Edn」やRochkindの「Advanced Unix Programming」などの本にあります。
私は最近(ここ数年)、自分自身を適切にデーモン化しない反抗的なプログラムに対処する必要がありました。nohupに似ていますが、より多くのコントロールが利用可能である、一般的なデーモン化プログラムを作成することで、私はそれを処理することになりました。
Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
-V print version and exit
-a output files in append mode (O_APPEND)
-b both output and error go to output file
-c create output files (O_CREAT)
-d dir change to given directory
-e file error file (standard error - /dev/null)
-h print help and exit
-i file input file (standard input - /dev/null)
-k fd-list keep file descriptors listed open
-m umask set umask (octal)
-o file output file (standard output - /dev/null)
-s sig-list ignore signal numbers
-t truncate output files (O_TRUNC)
-p print daemon PID on original stdout
-x output files must be new (O_EXCL)
二重ダッシュは、GNU getopt()関数を使用しないシステムではオプションです。Linuxなどでは必要です(または環境でPOSIXLY_CORRECTを指定する必要があります)。ダブルダッシュはどこでも機能するため、使用することをお勧めします。
のソースが必要な場合は、私(firstname dot lastname at gmail dot com)に連絡できますdaemonize
。
ただし、コードは(最終的に)SOQ(Stack Overflow Questions)リポジトリのGitHub daemonize-1.10.tgz
の
packages
サブディレクトリにあるファイルとして利用できるようになりました。
Debianベースのシステム(リモートマシン)にインストールします。
sudo apt-get install tmux
使用法:
tmux
必要なコマンドを実行する
セッションの名前を変更するには:
Ctrl + B、次に$
名前を設定
セッションを終了するには:
Ctrl + B、続いてD
(これによりtmuxセッションが終了します)。その後、SSHからログアウトできます。
もう一度戻って確認する必要がある場合は、SSHを起動して次のように入力します。
tmux attach session_name
tmuxセッションに戻ります。
ほとんどのプロセスでは、この古いLinuxコマンドライントリックを使用して疑似デーモン化できます。
# ((mycommand &)&)
例えば:
# ((sleep 30 &)&)
# exit
次に、新しいターミナルウィンドウを起動して、
# ps aux | grep sleep
sleep 30
まだ実行中であることが表示されます。
あなたがしたことは、プロセスを子の子として開始することであり、終了するとき、nohup
通常プロセスを終了させるトリガーとなるコマンドは孫にカスケードされず、孤立したプロセスとして残り、実行されます。
私はこの「それを設定し、それを忘れて」アプローチ、対処する必要はありません好むnohup
、screen
I / Oリダイレクション、tmuxのを、またはその原料のいずれか。
nohup
詳細をファイルに記録する場合は、非常に便利です。しかし、バックグラウンドになると、スクリプトが要求した場合にパスワードを与えることができません。やってみないといけないと思いますscreen
。そのユーティリティは、たとえばCentOSのyumを使用してLinuxディストリビューションにインストールしてyum install screen
から、シェルタイプでputtyまたは別のソフトウェアを介してサーバーにアクセスできますscreen
。画面[0]をパテで開きます。仕事をしなさい。同じパテセッションでさらにscreen [1]、screen [2]などを作成できます。
知っておくべき基本的なコマンド:
スタート画面
C reate次の画面
移動するにはn個作成した内線画面
D etach
作業中はパテを閉じます。そして次回パテタイプでログインするとき
画面に再接続すると、画面上で実行中のプロセスを確認できます。画面を終了するには、#exitと入力します。
詳細については、を参照してくださいman screen
。
yum
が適切なツールであると仮定すると、ディストリビューションがわからない場合は適切ではありません。screen
でインストールできるディストリビューションを明確にする必要がありますyum
。
Nohupは、ログアウト時の引数として、親プロセスが強制終了された場合にクライアントプロセスを強制終了しないようにします。さらにより良い使用:
nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG " > /dev/null
Nohupは、SSHセッションとその子プロセスがログアウト時に強制終了される終了の影響を受けないプロセスを作成します。私が与えたコマンドは、アプリケーションのpidをpidファイルに保存する方法を提供します。これにより、後でそれを適切に強制終了し、ログアウト後にプロセスを実行できます。
画面を使用します。使い方はとても簡単で、端末のvncのように動作します。 http://www.bangmoney.org/presentations/screen.html
私もスクリーンプログラムに行きます(他にsome1の答えがスクリーンだったことはわかっていますが、これは完了です)
&、ctrl + z bg disown、nohupなどがログオフしたときにジョブが依然として殺されるという厄介な驚きを与えるかもしれないという事実だけでなく(なぜ私は知らないが、それは私に起こりました、そしてそれは気にしませんでした)それが原因で私は画面を使用するように切り替えましたが、二重分岐がそれを解決するので、私はanthonyrisingerソリューションを推測します)、また、画面には単なるバックグラウンドよりも大きな利点があります:
screen will background your process without losing interactive control to it
ところで、これは私が最初に尋ねることは決してない質問です:) ...私は任意のUNIXで何でも最初から画面を使用しています...私は(ほとんど)画面を起動せずにUNIX / Linuxシェルで作業することはありません最初に...そして私は今止めるべきです、そうでなければ私は何が良い画面で何ができるかについての無限のプレゼンテーションを始めます...自分でそれを調べてください、それは価値があります;)
&
(非同期実行)は、UNIX の最初のバージョン用にThompsonシェルによって1971年に導入されました ... したがって、文字通り「常に存在していた」 ;-)ああ、私はあまりにも保守的でした-それは実際には41年になります。
screenコマンドを使用しました。このリンクには、これを行う方法に関する詳細があります
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
受け入れられた答えはnohupの使用を提案します。むしろpm2の使用をお勧めします。nohupでpm2を使用することには、アプリケーションを存続させること、アプリケーションのログファイルを維持すること、その他多くの機能など、多くの利点があります。詳しくはこちらをご覧ください。
pm2をインストールするには、npmをダウンロードする必要があります。Debianベースのシステムの場合
sudo apt-get install npm
そしてRedhatのために
sudo yum install npm
または、これらの指示に従うことができます。インストールした後NPM使用してインストールするにはPM2を
npm install pm2@latest -g
完了したら、次の方法でアプリケーションを開始できます
$ pm2 start app.js # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py # Start, Daemonize and auto-restart application (Python)
プロセスの監視には、次のコマンドを使用します。
$ pm2 list # List all processes started with PM2
$ pm2 monit # Display memory and cpu usage of each app
$ pm2 show [app-name] # Show all informations about application
アプリ名またはプロセスIDを使用してプロセスを管理するか、すべてのプロセスをまとめて管理します。
$ pm2 stop <app_name|id|'all'|json_conf>
$ pm2 restart <app_name|id|'all'|json_conf>
$ pm2 delete <app_name|id|'all'|json_conf>
ログファイルは次の場所にあります
$HOME/.pm2/logs #contain all applications logs
バイナリ実行可能ファイルは、pm2を使用して実行することもできます。jasonファイルを変更する必要があります。変更"exec_interpreter" : "node"
するために、"exec_interpreter" : "none".
(参照属性セクションを)。
#include <stdio.h>
#include <unistd.h> //No standard C library
int main(void)
{
printf("Hello World\n");
sleep (100);
printf("Hello World\n");
return 0;
}
上記のコードをコンパイルする
gcc -o hello hello.c
そしてそれをバックグラウンドでnp2で実行します
pm2 start ./hello
systemd / Linuxでは、systemd-runはセッションに依存しないプロセスを起動するための優れたツールです。言いたい奴には言わせとけ