追加読書

追加読書

起動時に電子メールトンネルとソックスプロキシを自動的に起動したいと思います。/etc/init.d/email-tunnels私のホームディレクトリにある他のスクリプトを呼び出すスクリプトがあります。起動時には動作せず、実行すると動作しませんがsudo service email-tunnels start、ただ実行すると動作しますsudo /etc/init.d/email-tunnels start。ちなみに、私は他のコンピュータ(Debian 8)と同じ設定をしていますが、そのコンピュータでは魅力的です。

詳細は次のとおりです(Ubuntu 18設定、機能しない設定)。

[···]$ ls -lh /etc/init.d/email-tunnels 
-rwxr-xr-x 1 root root 602 Aug 28 10:21 /etc/init.d/email-tunnels
[···]$

内容は次のとおりです(一部のデバッグを含むecho)。

[···]$ cat /etc/init.d/email-tunnels 
#! /bin/sh

### BEGIN INIT INFO
# Provides:     email_tunnels
# Required-Start:   $all
# Required-Stop:    $remote_fs $syslog
# Default-Start:    2 3
# Default-Stop:     0 1 6
# Short-Description:    E-mail and HTTP tunnels over SSH
### END INIT INFO

echo "email-tunnels invoked at `date`" >> /tmp/email-tunnels.log

touch /var/lock/email-tunnels

case "$1" in
  start)
    echo "email-tunnels executing 'start' at `date`" >> /tmp/email-tunnels.log
    su -c "/home/cal/bin/email.sh &" cal
    ;;
  stop)
    ;;
  *)
    echo "Usage: /etc/init/email-tunnels {start|stop}"
    exit 1
    ;;
esac

exit 0

その後、私のホームディレクトリのスクリプトは次のようになります。

[···]$ ls -lh /home/cal/bin/email.sh 
-rwxr-xr-x 1 cal cal 410 Aug 28 10:09 /home/cal/bin/email.sh
[···]$ 

そしてその内容は次のとおりです。

[···]$ cat /home/cal/bin/email.sh 
#!/bin/bash

echo "email.sh executed at `date`" >> /tmp/email.log
sleep 30

while [ "1" == "1" ]
do
    echo "email.sh about to execute ssh at `date`" >> /tmp/email.log
    ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected]
    sleep 120
done

私のターゲット(サーバー)システムのトンネルユーザーは、ユーザー対話なしで(パスワードを提供する必要はありません)、SSHを使用できるように正しく設定されたPK認証を持っています。

なぜ動作しないのかご存知ですか?デバッグ出力でinit.dスクリプト(email-tunnels)が実行されていることがわかりますが(/tmp/email-tunnels.logで出力を見ることができます)、/home/cal/bin/email.shは実行されませんではありません。 - -- 手動で実行すると/etc/init.d/email-tunnels start/tmp/email.log デバッグ出力が表示され、この時点で実行後にトンネルが正常に動作します。

答え1

あなたは2016年からシステム化されたOS、2006年からUpstart OSであるUbuntu Linuxを使用しています。 van Smoorenburgrcスクリプトの場合はそうではありません。特に新しいケースではさらにそうです。

特にこの場合。ほとんど候補です。恐怖の家。システムでは、結果サービスユニットはスクリプトを解釈するためのプロセスを実行しています。このプロセスは実行するプロセスをフォークしsu(権限を削除するためにそのプロセスを乱用し)、シェルを実行するためのプロセスをフォークし、他のスクリプトを解釈するためにプロセスをフォークします。貧しい人のデーモン監督を無限ループで実行し、分岐し続けますssh

そして、これはサービス管理者ができることをすることです。それでも:特定のユーザーで特定のプログラムを実行して終了するたびに再起動します。

journalctl -bログを読み、次の非常に簡単な基盤を構築する方法を学びます。

# /etc/systemd/system/email_tunnels.service
[単位]
Description=SSH経由の電子メールとHTTPトンネリング
ドキュメント=https://unix.stackexchange.com/a/465353/5132

[提供する]
ユーザー=cal
タイプ=シンプル
ExecStart=/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25[Eメール保護]
再起動秒=120

[インストールする]
WantedBy =マルチユーザー。ターゲット

その後、SSH IDファイルを含むホームディレクトリが利用可能になったら、サービスを実行する必要があります。もちろん、一部の設定ではこれが本当です。ログイン後ホームディレクトリが自動的にマウントされ、復号化されました。この場合、システムレベルのサービスを設定しないことがあります。別の言葉代わりに、初めてログインしたときに起動される各ユーザーのsystemdインスタンスでユーザーサービスとして実行してください。

# /home/cal/.config/systemd/user/email_tunnels.service
[単位]
Description=SSH経由の電子メールとHTTPトンネリング
ドキュメント=https://unix.stackexchange.com/a/465353/5132

[提供する]
タイプ=シンプル
ExecStart=/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25[Eメール保護]
再起動秒=120

[インストールする]
WantedBy=default.target

もちろん、これらのユーザー固有のサービスを制御する--userには、オプションを使用してください。systemctl

追加読書

関連情報