aachyeeのブログ

備忘録的メモ。主にIT(プログラミング、電子工作)、DIY、アウトドアネタ。詳細はaboutを。

batファイルで多重起動(二重起動)を防止する

バッチファイルで多重起動(二重起動)を抑止するコードを探してみました。

bat 多重|二重 実行|起動 抑止|禁止|防ぐ|防止|できないように|させない - Google 検索

 方法として、大まかに2つあることがわかりました。

  • 方法1:バッチファイル自身を追記モードで開く。
  • 方法2:ロックファイルを使う。
  • 方法3:tsklistコマンドを使って実行している数をチェックする。

たが、方法3はチェックする前に複数起動されるとどれもチェックに引っかかり、行いたい処理が実行できない。よって方法1をベースにブラッシュアップしてみた。

@echo off
call :set_errorlevel 1
call :main %* 3>>"%~dpnx0"
if %ERRORLEVEL% neq 0 echo Error 1>&2
goto :eof
:set_errorlevel
exit /b %1
:main
echo main start
timeout 15
echo main end
exit /b 0

ちなみに方法1には、実行中はバッチファイル自体を変更できないという特徴があり、これもメリットでもあるが注意が必要である。不用意にエディタで開いているとすでに実行中であると判断されてしまいます。また、利用者にバッチファイル自体に書き込める権限があるのは危険です。
これを回避するには、方法2でかつ、バッチファイル自体を読み取り専用にします。コードは以下のようになります。テスト中はattrib行をコメントアウトして下さい。

@echo off
attrib +r %~dpnx0
call :set_errorlevel 1
call :main %* 3> "%TEMP%%~nx0.lock"
if %ERRORLEVEL% neq 0 echo Error 1>&2
del "%TEMP%%~nx0.lock" >nul 2>&1
goto :eof
:set_errorlevel
exit /b %1
:main
echo main start
timeout 15
echo main end
exit /b 0

 

参考にしたページ

Microsoft製品) コマンドプロンプト:バッチの多重起動を抑制する - YiaoWang

バッチファイルlを2重起動できないようにしたい - その他(プログラミング) 締切済み 【OKWAVE】

バッチファイルの二重起動を防止する。(その2) Windows Script Programming

バッチの二重起動防止 - ひらいて

以上です。

 

2017/9/1 追記

コードに問題があったので修正しました。ERRORLEVELをSETで変更していたところをサブルーチンを使った方法に変更、:mainサブルーチンの戻り値を0するところを追加、リダイレクト元のFDが0だとtimeoutコマンドがエラーになるので3に変更しました。FD3を使う場合はそれ以上に変更して下さい。

前日のGMT日付が含まれたURLのページを表示するBookmarklet

Javascriptタイムゾーンを変更することができないのでちょっと厄介でした。

javascript:(function(d=new Date()){d=d.getTime()+(d.getTimezoneOffset()*60000);d=new Date(d+3600000*0);d.setDate(d.getDate()-1);document.location=`https://example.com/date=${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}`})();


参考にしたページ
【Javascript】翌日、前日の日付を取得する。- うぇぶろぐらまーな日誌
JavaScriptで違うタイムゾーンの時刻を得る - 刺身☆ブーメランのはてなダイアリー
JavaScript(jQuery)における文字列中に変数を記述する方法ってあるでしょうか? - スタック・オーバーフロー

ブックマークレットにdata:text/htmlを使ってiframeを含む内容を記述するとブロックされる時がある。

Firefoxブックマークレットにdata:text/htmlを使ってiframeを含む内容を記述すると、iframeが表示されない時がある。
正確にはhttpsのページを開いている状態で、そういったブックマークレットを実行すると起きる。ちなみにChromeでは起きない。
これが起きるとブラウザのコンソールに「混在アクティブコンテンツ “http://…” の読み込みをブロックしました」と警告が出る。
これを回避するには、URL欄の左のiマークをクリックして「このセッションのみ保護を無効にする」をクリックすれば良いが、いちいち面倒である。
そこでこれを回避する方法を探ってみた。最初にjavascriptのlocationで転送してみた。

data:text/html,<script>location='data:text/html,<html><body><iframe...

しかし同じくブロックされた。次にhtmlのmeta refreshを使ってみた。

data:text/html,<html><head><meta http-equiv='refresh content='0;URL=data:text/html,<html><body><iframe...

なぜかよくわからないがブロックされず、無事解決した。

RubyInstallerでMSYS2 and MINGW development toolchainをインストルール中にエラーが起きる

rubyinstaller 2.4.1-1-x64 をインストールするときに"Run 'ridk install' to install MSYS2 and development toolchan."をチェックし、コンソールで"3 - MSYS2 and MINGW development toolchain"を選んだときに、"error: target not found: mingw-w64-x86_64-winstorecompat-git" というエラーが出てインストールできない。
OSはWindows 10 Home 64bitです。

1 - MSYS2 base installation
2 - MSYS2 repository update
3 - MSYS2 and MINGW development toolchain
Which components shall be installed? 3

MSYS2 seems to be already installed
Install MSYS2 and MINGW development toolchain ...
> pacman -S --needed --noconfirm autoconf autoconf2.13 autogen automake-wrapper automake1.10 automake1.11 automake1.12 automake1.13 automake1.14 automake1.15 automake1.6 automake1.7 automake1.8 automake1.9 diffutils file gawk grep libtool m4 make patch pkg-config sed texinfo texinfo-tex wget mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-make mingw-w64-x86_64-pkg-config mingw-w64-x86_64-tools-git mingw-w64-x86_64-winpthreads-git mingw-w64-x86_64-winstorecompat-git
warning: autoconf-2.69-3 is up to date -- skipping
中略
warning: mingw-w64-x86_64-winpthreads-git-5.0.0.4634.697f757-1 is up to date -- skipping
error: target not found: mingw-w64-x86_64-winstorecompat-git
Install MSYS2 and MINGW development toolchain failed
Installation failed: pacman failed

原因は、すでにシステムにMSYS2がインストールされているが、バージョンが古いためのようである。

回復の仕方

方法は2つ。

  1. インストールされているMSYS2のシェルを起動してパッケージのアップデート行う。
  2. 既存のMSYS2を消しても良いならアンインストール後、最新のMSYS2をインストールしてアップデートを行う。

なお、実行しているRubyInstaller(コンソールの方)はそのままでもよい。

MSYS2のアップデート方法

キャッシュを全て削除してパッケージを更新する。

$ pacman -Scc #全てy
$ pacman -Syy
$ pacman -Suu

ファイルのダウンロード中に何度も切断され失敗するような場合は、wget をインストールして、/etc/pacman.conf の[options]に下記の1行を追加して再試行する。

XferCommand = /usr/bin/wget --timeout=30 --tries=100 --passive-ftp -c -O %o %u

MSYS2 and MINGW development toolchainのインストール

MSYS2のパッケージを更新後、MSYS2 and MINGW development toolchainのインストールを再度試みる。

1 - MSYS2 base installation
2 - MSYS2 repository update
3 - MSYS2 and MINGW development toolchain
Which components shall be installed? 3

MSYS2 seems to be already installed
Install MSYS2 and MINGW development toolchain ...
> pacman -S --needed --noconfirm autoconf autoconf2.13 autogen automake-wrapper automake1.10 automake1.11 automake1.12 automake1.13 automake1.14 automake1.15 automake1.6 automake1.7 automake1.8 automake1.9 diffutils file gawk grep libtool m4 make patch pkg-config sed texinfo texinfo-tex wget mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-make mingw-w64-x86_64-pkg-config mingw-w64-x86_64-tools-git mingw-w64-x86_64-winpthreads-git mingw-w64-x86_64-winstorecompat-git
warning: autoconf-2.69-3 is up to date -- skipping
中略
warning: libtool-2.4.6-2 is up to date -- skipping
resolving dependencies...
looking for conflicting packages...

Packages (32) glib2-2.48.2-1 libgc-7.6.0-1 libgcrypt-1.6.4-1
libguile-2.0.14-1 libunistring-0.9.7-1 libxslt-1.1.29-1
autoconf2.13-2.13-2 autogen-5.18.12-1 diffutils-3.5-1
file-5.30-1 gawk-4.1.4-2 grep-3.0-1 m4-1.4.18-1 make-4.2.1-1
mingw-w64-x86_64-binutils-2.28-1
mingw-w64-x86_64-crt-git-5.0.0.4834.33ee6cab-1
mingw-w64-x86_64-gcc-6.3.0-3 mingw-w64-x86_64-gcc-libs-6.3.0-3
mingw-w64-x86_64-headers-git-5.0.0.4836.670da35c-1
mingw-w64-x86_64-libmangle-git-5.0.0.4760.d3089b5-1
mingw-w64-x86_64-libwinpthread-git-5.0.0.4833.f057c525-1
mingw-w64-x86_64-make-4.2.1-1
mingw-w64-x86_64-pkg-config-0.29.2-1
mingw-w64-x86_64-tools-git-5.0.0.4760.d3089b5-1
mingw-w64-x86_64-winpthreads-git-5.0.0.4833.f057c525-1
mingw-w64-x86_64-winstorecompat-git-5.0.0.4760.d3089b5-1
patch-2.7.5-1 pkg-config-0.29.2-1 sed-4.4-2 texinfo-6.3-1
texinfo-tex-6.3-1 wget-1.19.1-1

Total Download Size: 59.66 MiB
Total Installed Size: 402.53 MiB
Net Upgrade Size: 58.96 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...

MSYS2にすでにインストールされているパッケージによるだろうが、400MB以上ディスクを使用します。

追記

こんな面倒なことしなくても1,2,3とすればいいだけのようでした。

Windows環境でRailsを動かしてみた - 或るプログラマの開発日記

インストール時に"Use UTF-8 as default external encoding."にチェックを入れておいたほうが良いこともわかりました。もし付け忘れたときは、環境変数に"RUBYOPT=-Eutf-8"を追加しましょう。

あと、toochainのインストーラは、"/Ruby24-x64/lib/ruby/site_ruby/2.4.0/ruby_installer/runtime/ridk.rb" にありました。