これは答えることができるSSH経由でスクリプトを実行し続けます。、スーパーユーザーでコマンドを実行する必要がない場合。たとえば、見てみましょう。私のサーバーに次のスクリプト~/testsleep.sh
もあるとしましょうchmod +x
。
#!/usr/bin/env bash
logger Pre sleep: "$USER" / "$USERNAME" / "$1"
sleep 5
logger Post sleep: "$USER" / "$USERNAME" / "$1"
stdout / stderrが失われる可能性があるため、ログインしたいとlogger
思います。/var/log/syslog
ssh
ssh
ローカルPCでこのプログラムを実行し、リモートサーバーを介してログインしているとします。
server$ readlink -f ~/testsleep.sh
/home/user/testsleep.sh
server$ $ ls -la testsleep.sh
-rwxr-xr-x 1 user user 126 2015-02-05 13:35 testsleep.sh
server$ sudo /home/user/testsleep.sh some_argument
sudo: unable to execute /home/user/testsleep.sh: No such file or directory
sudo
最初の問題は、次を使用してスクリプトを直接実行できないことです。現在、シェルは通常のユーザーIDで実行されており、rootアクセス権を付与できません。」sudoPermissions_shell_Stackを使用して現在のシェルでシェルスクリプトを実行する
わかりました、わかりました、走りますsudo bash
。それでは、次のように見えます。
server$ sudo bash /home/user/testsleep.sh some_argument
server$ tail -2 /var/log/syslog
Feb 5 13:40:48 user user: Pre sleep: root / root / some_argument
Feb 5 13:40:53 user user: Post sleep: root / root / some_argument
明らかにスクリプトがログインし、期待どおりにsyslog
表示されます。今まではそんなに良くなった。root
$USER
ssh
これで、ターミナルセッションを終了する前に、このスクリプトをサーバーのプロセスとして実行したいと思います。私はこのように思う:
server$ sudo bash /home/user/testsleep.sh from_end & exit
[1] 6293
logout
Connection to 127.1.100.99 closed.
local$
サーバーに再度ログインしてsyslog
再確認すると、最後の「exit」呼び出しにログがないことがわかります。
# this `grep` will print the filename, if file doesn't contain the match:
server$ grep --files-without-match 'from_end' /var/log/syslog
/var/log/syslog
server$ tail -2 /var/log/syslog
Feb 5 13:40:48 mypc user: Pre sleep: root / root / some_argument
Feb 5 13:40:53 mypc user: Post sleep: root / root / some_argument
だから私の質問は - このスクリプトをサーバーのsudoからプロセスとして実行する方法です。ただし、ssh
シェルから呼び出して終了する前に実行するようにしてください(この場合は作成して確認してくださいsyslog
)。
答え1
disown
接続が「中断」しても終了しないようにするには、次のものが必要です。
sudo bash /home/user/testsleep.sh from_end & sleep 1; disown -h; exit
そのsleep 1
目的は、バックグラウンドジョブの開始とシェルの終了間の競争を減らすことです。 1行にすべての操作を実行したくない場合は、2つのコマンドセットを分離してより良い結果を得ることができます。
sudo bash /home/user/testsleep.sh from_end &
disown -h; exit