Akışta ed by komutlarıyla crontab, "değişiklik yapılmadı" ile sonuçlanır.

0

Soru

Crontab dosyama bir satır eklemeye çalışıyorum. Bu soruna geçici bir çözüm bulmanın başka yolları olduğunu biliyorum, ancak yine de buna neyin neden olduğunu bilmek istiyorum. Komut ahududu pi 3 B+ üzerinde çalıştırılır, GNU ed 1.15, cron 3.0pl1-134+deb10u1 ile raspbian lite yüklenir.

Sıkışıp kaldığım komut şudur::

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed crontab -e
902
909
No modification made

Satır eklemesini bekliyorum #asdf crontab dosyamın sonunda, ama değil.

Ayar EDITOR='tee -a' önerildiği gibi https://stackoverflow.com/a/30123606/8842387 bu sorunu çözmez. Sanırım cron ile ilgili sorun bu.

Garip bir şekilde, doğrudan klavyeden ed komutları verdiğimde, akış yerine, sadece çalışır. Belki de alt kabuk oluşturma soruna neden oldu?

İşte son satırlardan birkaçını ekliyorum strace sonuç.

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed strace crontab -e
execve("/usr/bin/crontab", ["crontab", "-e"], 0x7ee54c14 /* 29 vars */) = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
...
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 659
_llseek(3, -393, [266], SEEK_CUR)       = 0
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 393
close(3)                                = 0
getpid()                                = 18579
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = 0
send(3, "<78>Nov 20 15:31:25 crontab[1857"..., 56, MSG_NOSIGNAL) = 56
openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(4, "# Locale name alias data base.\n#"..., 4096) = 2995
read(4, "", 4096)                       = 0
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB/LC_MESSAGES/libc.mo", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=1433, ...}) = 0
mmap2(NULL, 1433, PROT_READ, MAP_PRIVATE, 4, 0) = 0x76f50000
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "crontabs/pi/: fdopen: Permission"..., 39crontabs/pi/: fdopen: Permission denied) = 39
exit_group(1)                           = ?
+++ exited with 1 +++

openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied) biraz şüpheli görünüyor, ancak dosyayı neden salt okunur açtığından emin değilim.

düzenlemek: @Tink tarafından önerildiği gibi koştum EDITOR=ed strace crontab -e ne olduğunu görmek için strace etkileşimli bir oturum verir. Sonuç hemen hemen aynıydı (sadece pıd ve fd sayılarına göre değişiyordu).

Çalışan fark ettim echo "..." | EDITOR=ed crontab -e mesajla çıkıldı No modification made ama ile strace işlem herhangi bir ileti olmadan durur. (EDITOR=ed strace crontab -e 2>&1 | grep "No mod" parmak izi yok). Strace farklı hataları tetikler sanırım.

bash cron ed linux
2021-11-20 06:41:51
1

En iyi cevabı

0

GÖRSEL yorumumu takiben, bunlar benim için çalıştı:

( unset VISUAL; printf '%s\n' a '#abcd' . wq | EDITOR=ed crontab -e )
printf '%s\n' a '#abcd' . wq | VISUAL=ed crontab -e

Ortamımda hem GÖRSEL hem de DÜZENLEYİCİ "vim" olarak ayarlandı.

Ya da daha dolambaçlı, ama env vars ile maymunlaşmaya gerek yok. Bu da sessizce yapmanıza izin veriyor:

crontab <(printf '%s\n' a '#asdf' . '%p' | ed -s <(crontab -l))

Yukarıdakileri bir Mac'te yapıyordum. Linux'ta gözlemlerinizi çoğaltabilirim ama açıklayamam.

Son komut için küçük bir çimdik çalışır:

printf '%s\n' a '#asdf' . '%p' Q | ed -s <(crontab -l) | crontab -
2021-11-21 20:34:51

Cevap için teşekkürler! Yukarıdaki iki satırdan hiçbirinin benim için işe yaramadığını ve sonuncusunun verdiğini söylemekten korkuyorum /dev/fd/63: Not a regular file. Belki bazı sistem yapılandırması farklı olabilir mi?
bivoje

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................