crontab -eで保存が出来ない問題に対応したメモ

crontab -e で編集後、エラーが出て保存出来ない問題に対応した。

環境

  • OS
    • ProductName: Mac OS X
    • ProductVersion: 10.11.6
    • BuildVersion: 15G1217
  • zsh
    • 5.3.1
  • MacVim
    • 8.0

cronが保存出来ない

crontab -e でcronの内容を編集後にvimを抜けて保存しようとすると下記のようなエラーが出る。

zsh Terminal
1
2
$ crontab -e
crontab: temp file must be edited in place

google翻訳によると「一時ファイルを編集する必要があります」ということらしい。

原因

調べるとcron編集時にtmp以下にvimがバックアップファイルを作成するのが問題のよう。

vim ~/.vimrc
1
set nobackup

この設定でバックアップをしないとしてても発生するっぽい。

解決方法

下記の設定を.vimrcに追記して、tmp以下ではバックアップファイルを作成しないようにする。

vim ~/.vimrc
1
set backupskip=/tmp/*,/private/tmp/*

追記後再度cronを編集すると無事保存出来るようになりました。

zsh Terminal
1
2
$ crontab -e
crontab: installing new crontab

以上です。

参考URL

Mac OS X で cron を使う(EDITOR=vim) - yuyarinの日記

zshでvimのパス補完エラーに対応したメモ。

zsh + zplug で vim + Tab の補完を利用するとエラーになってしまうのを対応した。


環境

  • OS
    • ProductName: Mac OS X
    • ProductVersion: 10.11.6
    • BuildVersion: 15G1004
  • zsh
    • 5.2
  • zplug
    • 2.3.2
  • vim
    • 8.0

vimでファイルを開こうとするとエラーになる。

ターミナルから vim [Tab] でファイルを開こうとするとエラーが出るようになった。

1
2
$ vim
_arguments:451: _vim_files: function definition file not found

調べると簡単に解決出来る模様。

.zcompdump を削除しても解決しない。

エラーメッセージで検索をかけると大体以下の内容が出る。

1
2
$ rm ~/.zcompdump*
$ exec zsh

zcompdumpというのは、compinitのダンプファイルを生成し、起動時に読み込まれるらしい。
どうやら環境に依存するので、何かしら変更があるとエラーが出ることもあるとのこと。

zsh + zprezto + zplug から zsh + zplug にしたので、それの影響だと思い、さっそくやってみる。
がしかし、解決しない。

zplugが別のzcompdumpを読み込んでいた。

他の解決方法は出てこないので途方に暮れながら設定ファイルを見直す。
特に変わったところもない。

何かプラグインでやらかしているんじゃないかと調べると、zplugのディレクトリにzcompdumpとzcompdump.zwcというファイルがあるのを発見した。

1
2
3
$ cd $ZPLUG_HOME
$ rm zcompdump*
$ exec zsh

これでエラーがでなくなりました。

以上です。

Docker-compose exec で出たPythonエラー対応メモ。

Jenkinsやらgitのhookやらで利用した時にPythonのエラーが出たのを対応したメモ。


環境

  • OS
    • ProductName: Mac OS X
    • ProductVersion: 10.11.6
    • BuildVersion: 15G1004
  • Docker
    • 1.12.1
  • docker-compose
    • 1.8.0

docker-compose exec でエラーが発生する

Jenkinsやらgitのhookで docker-compose exec を利用するとエラーが発生する。
例えばJenkisnの場合を例として app コンテナで script.sh というシェルスクリプトを実行してみる。

単純なスクリプト。

script.sh
1
2
3
#!/bin/bash -eu

echo "hoge"

Jenkinsには以下を設定。

Jenkins
1
2
3
4
5
6
node {
stage 'Run Script'
dir("${APP_DIR}") {
sh '/usr/local/bin/docker-compose exec app /app/script.sh'
}
}

実行後、以下のエラーが発生する。

Terminal
1
2
3
4
5
6
7
8
9
10
11
[Server] Running shell script
+ /usr/local/bin/docker-compose exec app /app/script.sh
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "compose/cli/main.py", line 61, in main
File "compose/cli/main.py", line 113, in perform_command
File "compose/cli/main.py", line 441, in exec_command
File "site-packages/dockerpty/pty.py", line 338, in start
File "site-packages/dockerpty/io.py", line 32, in set_blocking
ValueError: file descriptor cannot be a negative integer (-1)
docker-compose returned -1

TTYが悪さをしているらしい

調べると原因はわからないが、ttyを無効にすると止まらなくなったよというような内容を見つけた。

ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。

docker-compose exec -h でヘルプを見ると以下のオプションがあった。

-T Disable pseudo-tty allocation. By default docker-compose exec
allocates a TTY.

これをつけて実行するとttyが無効になるらしいので、つけてみる。

Jenkins
1
2
3
4
5
6
node {
stage 'Run Script'
dir("${APP_DIR}") {
sh '/usr/local/bin/docker-compose exec -T app /app/script.sh'
}
}

実行後の結果。

Terminal
1
2
3
[Server] Running shell script
+ /usr/local/bin/docker-compose exec -T app /app/script.sh
hoge

-T をつけることで問題なく動くようになった。

以上です。

© 2024 磁力式駆動 All Rights Reserved.
Theme by hiero