bash スクリプトで openvpn クライアントのプロセス ID を取得する

bash スクリプトで openvpn クライアントのプロセス ID を取得する

bash スクリプトでは、次のように openvpn をクライアントとして起動しています。

#!/bin/bash
conf_file=/etc/openvpn/blahblah.conf
openvpn_pid_file="/var/run/openvpn-client/ovpnc.pid"
command_line="/usr/bin/openvpn --config $conf_file --daemon"
$command_line
openvpn_pid=$!
echo "openvpn_pid=$openvpn_pid"
echo $openvpn_pid >> "$openvpn_pid_file"

openvpn が正常に起動した後、変数 openvpn_pid は空で、openvpn_pid_file も空です。ただし、pgrep openvpnPID は表示されます。スクリプトでその PID が取得されないのはなぜですか? 変数に正しい PID を取得し、最終的に openvpn_pid_file に取り込むには、何を変更すればよいですか?

これらはすべて Arch Linux 上で行われます。

答え1

からman bash

   !      Expands  to  the  process ID of the job most recently placed into the background, whether executed as an asynchronous command or using the bg              builtin

言い換えると、$!プロセスがバックグラウンドにある場合にのみ値が含まれます。プロセスをバックグラウンドにしていないため殻から$!空なので、openvpn_pid空です。

解決策については、Sven のコメントに記載されています。

はどうかと言うと

関連情報